Erreur du compilateur C3867
Mise à jour : novembre 2007
Message d'erreur
'fonction' : liste d'arguments manquante dans l'appel de fonction ; utilisez '&func' pour créer un pointeur vers membre
'func': function call missing argument list; use '&func' to create a pointer to member
Vous avez essayé de prendre l'adresse d'une fonction membre sans qualifier la fonction membre avec son nom de classe et l'opérateur d'adresse.
Cette erreur peut également être due à la mise en conformité du compilateur pour Visual C++ 2005 : conformité pointeur vers membre améliorée. Le code compilé avant Visual C++ 2005 génère désormais l'erreur C3867. Pour plus d'informations, consultez Modifications avec rupture dans le compilateur Visual C++ 2005.
Exemple
Dans Visual C++ 2005, l'erreur C3867 peut provenir du compilateur avec une résolution suggérée équivoque. Si possible, utilisez la classe la plus dérivée.
L'exemple suivant génère l'erreur C3867 :
// 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
}
L'exemple suivant génère l'erreur C3867 :
// 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
}
L'exemple suivant génère l'erreur C3867 :
// 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;
}
L'exemple suivant génère l'erreur C3867 :
// 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
}
};
L'exemple suivant génère l'erreur C3867 :
// 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);
}