我有这个示例代码:
struct A
{
int foo() { return 27; }
};
template<typename T>
struct Gobstopper
{
};
template<>
struct Gobstopper<int(void)>
{
Gobstopper(int, int) { } // To differentiate from general Gobstopper template
};
template<typename ClassType, typename Signature>
void DeduceMethodSignature(Signature ClassType::* method, ClassType& instance)
{
// If Signature is int(), Gobstopper<> should resolve to the specialized one.
// But it only does on x64!
Gobstopper<Signature>(1, 2);
}
int main(int argc, char** argv)
{
A a;
DeduceMethodSignature(&A::foo, a);
return 0;
}
这与g++
. 它也可以与 VC10 一起编译,但仅限于为 64 位平台构建时。当我为 32 位平台构建时,我得到这个编译错误:
error C2661: 'Gobstopper<T>::Gobstopper' : no overloaded function takes 2 arguments
1> with
1> [
1> T=int (void)
1> ]
1> c:\...\test.cpp(26) : see reference to function template instantiation 'void DeduceMethodSignature<A,int(void)>(Signature (__thiscall A::* ),ClassType &)' being compiled
1> with
1> [
1> Signature=int (void),
1> ClassType=A
1> ]
该错误表明正在使用非专业版本的 Gobstopper,这一定Signature
意味着int (void)
. 但错误也清楚地说Signature
是 int (void)
。那么错误从何而来?我该如何解决?
我唯一能想到的可能会从 32 位更改为 64 位并且不会出现在错误消息中显示的签名中的是调用约定;显然,VC x64 有一个统一的调用约定,而对于 x86,每个调用约定都是不同的。但即使这是问题所在,我也不知道如何解决它。
编辑:我应该提到我用常规(非成员)函数指针尝试了这个,效果很好。