Compilerfehler C3867
Aktualisiert: November 2007
Fehlermeldung
'Funktion': Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie '&Funktion', um einen Zeiger auf den Member zu erstellen.
'func': function call missing argument list; use '&func' to create a pointer to member
Es wurde versucht, die Adresse einer Memberfunktion zu verwenden, ohne die Memberfunktion mit dem zugehörigen Klassennamen und Adressoperator anzugeben.
Dieser Fehler kann außerdem infolge einer Verbesserung der Compilerkonformität für Visual C++ 2005 ausgegeben werden, und zwar bei Verbesserung der Memberzeigerkonformität. Für Code, der vor Visual C++ 2005 kompiliert wurde, wird nun C3867 generiert. Weitere Informationen finden Sie unter Wichtige Änderungen im Visual C++ 2005-Compiler.
Beispiel
C3867 wird in Visual C++ 2005 u. U. zusammen mit einem irreführenden Lösungsvorschlag ausgegeben. Verwenden Sie die am stärksten abgeleitete Klasse, wann immer dies möglich ist.
Im folgenden Beispiel wird C3867 generiert.
// C3867_1.cpp
// compile with: /c
struct Base {
protected:
void Test() {}
};
class Derived : public Base {
virtual void Bar();
};
void Derived::Bar() {
void (Base::*p1)() = Test; // C3867
&Derived::Test; // OK
}
Im folgenden Beispiel wird C3867 generiert.
// C3867_2.cpp
#include<stdio.h>
struct S {
char *func() {
return "message";
}
};
class X {
public:
void f() {}
};
int main() {
X::f; // C3867
// OK
X * myX = new X;
myX->f();
S s;
printf_s("test %s", s.func); // C3867
printf_s("test %s", s.func()); // OK
}
Im folgenden Beispiel wird C3867 generiert.
// C3867_3.cpp
class X {
public:
void mf(){}
};
int main() {
void (X::*pmf)() = X::mf; // C3867
// try the following line instead
void (X::*pmf2)() = &X::mf;
}
Im folgenden Beispiel wird C3867 generiert.
// C3867_4.cpp
// compile with: /c
class A {
public:
void f(int) {}
typedef void (A::*TAmtd)(int);
struct B {
TAmtd p;
};
void g() {
B b1;
b1.p = f; // C3867
}
};
Im folgenden Beispiel wird C3867 generiert.
// C3867_5.cpp
// compile with: /EHsc
#include <iostream>
class Testpm {
public:
void m_func1() {
std::cout << m_num << "\tm_func1\n";
}
int m_num;
typedef void (Testpm::*pmfn1)();
void func(Testpm* p);
};
void Testpm::func(Testpm* p) {
pmfn1 s = m_func1; // C3867
pmfn1 s2 = &Testpm::m_func1; // OK
(p->*s2)();
}
int main() {
Testpm *pTestpm = new Testpm;
pTestpm->m_num = 10;
pTestpm->func(pTestpm);
}