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 に答える