关于c ++:指向无静态方法的指针静态方法

Pointer static method that points to no static method

我一直在尝试创建一个指针函数,指向一个方法来执行这样的操作(VisualC++):

1
2
3
4
5
6
7
8
9
10
struct test
{
  int tst(int a)
  {
    return a * 4;
  }
};
// ok, this the visual C++ compiler does not accept it... (mingw accept it)

int(*tstptr)(int) = (int(*)(int))&test::tst;

然后我做了这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Dx
{
    int SomeMethod()
    {
        return 4;
    }
};

struct Dy
{
    static int(*pSomeMethod)();    
};

int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;

到目前为止很好,这是没有问题的,但如果我试着打电话给她:

1
Dy::pSomeMethod();

编译器返回我:

Error 1 error LNK2001: external symbol"public: static int (__stdcall
* Dy::pSomeMethod) (void)" (? PSomeMethod@Dy@@2P6GHXZA) unresolved

我不明白,因为这不是假设以东十一〔0〕他不是指以东十一〔1〕吗?


你所申报的pSomeMethoddefines A的指针的函数在类的Dy时返回的那一int。。。。。。。你想declare它为它出现在linker错误: </P >

1
int (*Dy::pSomeMethod)();

这是一个成员的Dy这是一个指针的函数回归的int。。。。。。。 </P >

什么,你是试图做出做不会工作,因为Dx::SomeMethod是一个成员函数Dx,这需要一个this指针。通过电话pSomeMethod不会有一个。 </P >

当鼠标右键,你能做的,只是assign的地址的函数的指针,没有使用一种铸造。 </P >


1
int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;

类型检查,所以好的complain从编译器。 </P >

AS的方法: </P >

1
Dy::pSomeMethod();

这一_ _ cdecl。。。。。。。 但是,somemethod是一个_ _ thiscall,这意味它的真的很喜欢这个 </P >

1
int SomeMethod( Dx &this);

所以,linker不能find a match。 </P >

简,你不能调用非静态方法没有面向院级DX。 </P >


该类型的&test::tstint (test::*) (int),这是A的成员函数的指针。 </P >

你是试图做出转化到它的正常的分型,这是不可能的,因为他们是完全不同的。 </P >

"那为什么你会有这个型铸造的错误: </P >

1
2
error C2440: 'type cast' :
cannot convert from 'int (__thiscall test::* )(int)' to 'int (__cdecl *)(int)'