我有这些文件: -
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 ++标准对此有何看法?在这个问题上,任何一个编译器是“正确的”而另一个是“错误的”还是标准模糊不清,两者都是“正确的”?
答案 0 :(得分:9)
您的程序显示未定义的行为。根据C ++11§14.7.3/ 6,必须在使用它的每个翻译单元中声明专业化:
如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,那么该特化应该在第一次使用该特化之前声明,这将导致隐式实例化发生,在每个翻译单元中使用发生;无需诊断。