以下代码在vs2015中产生两个编译器错误:
C2995:void TestSpecialization<T>::f(void)
:功能模板已定义
C3860:类模板名称后面的模板参数列表必须按照模板参数列表中使用的顺序列出参数。
template <typename T>
class TestSpecialization
{
public:
void f() {}
};
template <typename T>
void TestSpecialization<T*>::f() // C3860, C2995
{}
错误的订单?!这最初看起来几乎是合理的...模板最初有3个参数(按照正确的顺序,顺便说一句)。但是现在它有一个参数,你在所有链接的名称中如何设法以错误的顺序获得它?!
思想
将2995错误中列出的类型设置为线索,它列出了没有T*
的原始类型。
只是为了让水变得泥泞,std::is_pointer
编译就好了。
我们完全有可能在编译器上使用一些奇怪的兼容性标志。
不,我不能使用if constexpr
。啊......做梦。