Partager via


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);
}