编译器警告(等级 1)C4347

更新:2007 年 11 月

错误消息

行为更改: 调用“function template”而不是“function”

在 Visual Studio .NET 中,如果已具有一个模板函数和一个与该模板函数同名的非模板函数,则编译器会错误地将该非模板函数视作模板函数的专用化。

为使代码在 Visual C++ 的所有版本中以相同方式工作,在非模板函数上添加 template<>,使其成为真正的显式专用化。

有关更多信息,请参见编译时的重大更改摘要

默认情况下关闭此警告。有关更多信息,请参见默认情况下处于关闭状态的编译器警告

示例

下面的示例生成 C4347。

// C4347.cpp
// compile with: /W4 /EHsc
#pragma warning (default : 4347)

template <typename T>
void f(T t) { T i = t; i = 0; }

void f(int i) { i++; }

// OK
template <typename T>
void f2(T t) { T i = t; i = 0; }

template <>
void f2(int i) { i++; }

int main() {
   f(5);   // regular function call
   f<int>(5);   // C4347 calls implicit instantiation

   f2(5);
   f2<int>(5);
}