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

时间:2012-06-21 19:04:17

标签: c++ templates g++ template-specialization icc

我有这些文件: -

1.h: -

#include <iostream>

using namespace std;

template <typename A>
void f() {
  cout<<"generic\n";
}

1.cpp: -

#include "1.h"

template <>
void f<int> () {
  cout<<"for ints only\n";
}

main.cpp: -

#include "1.h"

int main() {
  f<int>();
  return 0;
}

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

g++ -c 1.cpp -o 1.o 
g++ main.cpp 1.o
./a.out

我得到: -

for ints only

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

icpc -c 1.cpp -o 1.o
icpc main.cpp 1.o
./a.out

我得到: -

generic

C ++标准对此有何看法?在这个问题上,任何一个编译器是“正确的”而另一个是“错误的”还是标准模糊不清,两者都是“正确的”?

1 个答案:

答案 0 :(得分:9)

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

  

如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,那么该特化应该在第一次使用该特化之前声明,这将导致隐式实例化发生,在每个翻译单元中使用发生;无需诊断。