处理未实例化的模板函数

时间:2014-07-23 06:46:29

标签: c++ compiler-bug template-function

以下代码在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枚举。

哪个是对的?或者是这个实现定义了吗?

1 个答案:

答案 0 :(得分:6)

GCC是正确的,除了MSVC之外的所有其他编译器都会做同样的事情。

这是一个主要的错误,实际上出现在一个MSVC未来路线图上。这是在遥远的未来&#34;类别。他们将不得不重写他们的模板引擎来修复它。

有一种观点认为,对不正确的模板进行诊断是可选的,因为它实际上是一个没有格式良好的实例化的模板,并且不需要标记这些模板。然而,

  1. 标准要求解析模板,无论实例化如何,都必须诊断无法解析。
  2. 每个其他编译器都进行诊断,因此实际上不这样做会导致MSVC用户生成不可移植的代码。抱怨是一个非常好的主意,即使它不是必需的。