Kompilatorfel C3867

"func": funktionsanrop som saknar argumentlista; använd "&func" för att skapa en pekare till medlem

Anmärkningar

Du försökte ta adressen till en medlemsfunktion utan att kvalificera medlemsfunktionen med dess klassnamn och operatorns adress.

Det här felet kan också genereras som ett resultat av kompilatoröverensstämmelsearbete som utfördes för Visual Studio 2005: förbättrad pekare-till-medlem-överensstämmelse. Kod som kompilerades före Visual Studio 2005 genererar nu C3867.

Examples

C3867 kan genereras från kompilatorn med en vilseledande föreslagen lösning. Använd den mest härledda klassen när det är möjligt.

I följande exempel genereras C3867 och hur du åtgärdar det.

// 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
}

I följande exempel genereras C3867 och hur du åtgärdar det.

// 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
}

I följande exempel genereras C3867 och hur du åtgärdar det.

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

I följande exempel genereras 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
   }
};

I följande exempel genereras 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);
}