我试图通过指向C ++(VS2012)中成员函数的指针来找出类型转换问题的根本原因。
我已将其缩小到指向模板成员函数和非模板成员函数的指针的typeid
之间的差异。考虑一下代码:
#include <typeinfo>
#include <iostream>
class foo
{
public:
template<int k>
void func1() {}
void func2() {}
};
typedef void (foo::*foofunc)();
int main()
{
//this gives "int"
std::cout<<typeid(&foo::func1<3>).name()<<std::endl;
//this gives "void (__thiscall *)(void)"
std::cout<<typeid(&foo::func2).name()<<std::endl;
return 0;
}
func2
具有预期值。当两者都是同一类的成员函数时,为什么指向func1
的指针具有类型int
?
注意:仅在Windows上发生这种情况。
答案 0 :(得分:1)
这显然是VS 2012中的编译器错误。它与#775434 "decltype is buggy in VS 2012"密切相关,链接到this SO question。如果这确实是错误,那么除了升级到VS 2015之外,您可以尝试类似于此的解决方法(src):
template <typename T> T msvc_decltype_helper(T); // Never implemented.
#define FN_DECLTYPE(...) decltype(::msvc_decltype_helper(__VA_ARGS__))
即。尝试typeid(msvc_decltype_helper(&foo::func1<3>)).name()
输出。