Condividi tramite


Errore del compilatore C3867

'func': elenco di argomenti mancanti per la chiamata di funzione; usare '&func' per creare un puntatore al membro

Si è cercato di accettare l'indirizzo di una funzione membro senza qualificare la funzione membro con il nome della classe e l'operatore address-of.

Questo errore può essere generato anche in seguito al lavoro di conformità del compilatore eseguito per Visual Studio 2005: conformità avanzata del puntatore a membro. Il codice compilato prima di Visual Studio 2005 genera ora C3867.

Esempi

L'errore C3867 può essere generato dal compilatore con una risoluzione suggerita fuorviante. Se possibile, usare la classe più derivata.

L'esempio seguente genera l'errore C3867 e mostra come risolverlo.

// 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'esempio seguente genera l'errore C3867 e mostra come risolverlo.

// 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'esempio seguente genera l'errore C3867 e mostra come risolverlo.

// 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'esempio seguente genera l'errore 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'esempio seguente genera l'errore 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);
}