模板的typeids与非模板成员函数指针

时间:2015-11-19 15:10:52

标签: c++ function templates pointers visual-studio-2012

我试图通过指向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上发生这种情况。

1 个答案:

答案 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()输出。