另一个文件c ++中的模板特化.哪个版本得到

owa*_*agh 6 c++ templates g++ icc template-specialization

我有这些文件: -

1.h: -

#include <iostream>

using namespace std;

template <typename A>
void f() {
  cout<<"generic\n";
}
Run Code Online (Sandbox Code Playgroud)

1.cpp: -

#include "1.h"

template <>
void f<int> () {
  cout<<"for ints only\n";
}
Run Code Online (Sandbox Code Playgroud)

main.cpp: -

#include "1.h"

int main() {
  f<int>();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我用这样的g ++编译和运行它们: -

g++ -c 1.cpp -o 1.o 
g++ main.cpp 1.o
./a.out
Run Code Online (Sandbox Code Playgroud)

我得到: -

for ints only
Run Code Online (Sandbox Code Playgroud)

另一方面,我用icpc编译它像这样: -

icpc -c 1.cpp -o 1.o
icpc main.cpp 1.o
./a.out
Run Code Online (Sandbox Code Playgroud)

我得到: -

generic
Run Code Online (Sandbox Code Playgroud)

C++标准对此有何看法?是否有任何一个编译器"正确"而另一个"错误"或者在这个问题上标准模糊不清并且两者都"正确"?

Jam*_*lis 9

您的程序显示未定义的行为.根据C++11§14.7.3/ 6,必须在使用它的每个翻译单元中声明专门化:

如果模板,成员模板或类模板的成员是显式专用的,则应在首次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生此类使用的每个翻译单元中; 无需诊断.