컴파일러 오류 C3867
업데이트: 2007년 11월
오류 메시지
'func': 함수 호출에 인수 목록이 없습니다. '&func'을(를) 사용하여 멤버에 대한 포인터를 만드십시오.
'func': function call missing argument list; use '&func' to create a pointer to member
해당 클래스 이름과 주소 연산자를 사용하여 멤버 함수를 한정하지 않은 채 멤버 함수의 주소를 사용하려고 했습니다.
이 오류는 Visual C++ 2005에 대해 수행된 즉, 포인터와 멤버 사이의 규칙이 강화되었다는 컴파일 규칙에 따라 발생할 수도 있습니다. Visual C++ 2005 이전 버전으로 컴파일한 코드에서 C3867이 발생할 수 있습니다. 자세한 내용은 Visual C++ 2005 컴파일러의 주요 변경 사항을 참조하십시오.
예제
Visual C++ 2005 컴파일러에서 C3867이 발생하는 경우 권장 해결 방법이 잘못되었을 수 있습니다. 가능하면 가장 많이 파생된 클래스를 사용하십시오.
다음 샘플에서는 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
}
다음 샘플에서는 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
}
다음 샘플에서는 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;
}
다음 샘플에서는 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
}
};
다음 샘플에서는 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);
}