【发布时间】:2014-10-04 14:24:36
【问题描述】:
我正在尝试将类成员的类型作为模板参数传递。为此,我使用以下代码:
class C
{
public:
int a;
};
class B
{
public:
template<typename _T> void Test() {}
// Specialize for int for Test testing purposes.
template<> void Test<int>() { printf("Success!\n"); }
};
//Later:
B b;
C c;
b.Test<decltype(c.a)>();
这给了我以下错误:
错误 C2662: 'void B::Test(void)' : 无法转换 'this' 指针 从 'C' 到 'B &' 原因:无法从 'C' 转换到 'B' 转换 需要第二个用户定义的转换运算符或构造函数
但是,如果我使用以下代码,它确实有效:
decltype(c.a) d;
b.Test<decltype(d)>();
如果我只是直接使用类成员,为什么它不起作用? 我正在使用 Visual Studio 2012。
【问题讨论】:
-
我不知道这是否是问题所在,但 Visual Studio 对 C++11 的支持不完整。 VS2013更好。试试 oneide.com 上的代码
-
VS2012 中的
decltype非常糟糕。但是,这已在 VS2013 中修复。 -
这确实是Visual Studio 2012的问题,Visual Studio 2013编译它没有问题。模板专业化只是为了表明它适用于第二个版本。它不是最初错误代码的一部分。
标签: c++ templates visual-studio-2012 member decltype