7

我有这些文件:-

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++ 标准对此有何评论?是任何一个编译器“正确”而另一个“错误”还是标准在这个问题上模棱两可并且两者都是“正确的”?

4

1 回答 1

11

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

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

于 2012-06-21T19:14:53.893 回答