以下代码在Visual C ++ 2013中编译,但不在G ++ 4.8.2下编译:
template<class T>
int MyFunc(T& t)
{
return static_cast<int>(CCodes::blah);
}
template<>
int MyFunc(float& t)
{
return 0;
}
int main() {
float f = 10.f;
return MyFunc(f);
}
Visual C ++似乎忽略了常规模板函数,因为只使用了特化MyFunc<float>
。无论如何,G ++解析了一般函数,并发现尚未定义CCodes枚举。
哪个是对的?或者是这个实现定义了吗?
答案 0 :(得分:6)
GCC是正确的,除了MSVC之外的所有其他编译器都会做同样的事情。
这是一个主要的错误,实际上出现在一个MSVC未来路线图上。这是在遥远的未来&#34;类别。他们将不得不重写他们的模板引擎来修复它。
有一种观点认为,对不正确的模板进行诊断是可选的,因为它实际上是一个没有格式良好的实例化的模板,并且不需要标记这些模板。然而,