gpt4 book ai didi

c++ - 模板和非模板成员函数指针的类型标识之间的区别

转载 作者:行者123 更新时间:2023-11-28 05:57:59 25 4
gpt4 key购买 nike

我试图找出 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 上。

最佳答案

这显然是 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()输出。

关于c++ - 模板和非模板成员函数指针的类型标识之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com