在另一个文件中进行模板特化c++,哪个版本会得到调用?

8

I have these files :-

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

And I get :-

for ints only

另一方面,我使用icpc编译它,如下所示:-
icpc -c 1.cpp -o 1.o
icpc main.cpp 1.o
./a.out

And I get :-

generic

C++标准对此有何规定?是否有任何一个编译器是“正确”的,而另一个是“错误”的?或者标准在这个问题上存在歧义,两者都是“正确”的?

我相信_g++_是正确的选择,但未定义的行为领域很棘手... - K-ballo
2
在C++语言标准中,用优雅的措辞表达:当编写一个特化时,请谨慎选择其位置,否则使其编译通过将是一场试炼,可能会引发自我毁灭。 - James McNellis
@K-ballo 我也认为是这样。但我想要一个权威的来源指出这一点,不管是哪种方式。 - owagh
1个回答

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

如果显式特化了一个模板、成员模板或类模板的成员,则在每个使用该特化引起隐式实例化发生的地方之前声明该特化,在每个这样的使用所在的翻译单元中;不需要进行任何诊断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接