2012-06-21 8 views
6

Ich habe diese Dateien: -Template-Spezialisierung in einer anderen Datei C++. Welche Version wird

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; 
} 

Nun kompiliere ich und führe diese mit g ++ so aus: -

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

Und ich: -

for ints only 

Auf der anderen Seite, ich habe es mit icpc wie folgt zusammenstellen: -

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

Und ich: -

generic 

Was sagt der C++ Standard dazu? Ist irgendein Compiler "richtig" und der andere "falsch" oder ist der Standard in dieser Frage mehrdeutig und beide sind "richtig"?

+0

ich _g glauben würde ++ _ hier ist, aber die undefinierten Verhalten Länder sind schwierig ... –

+2

In den beredten Worten der Sprache C++ Standard: Wenn Sie eine Spezialisierung Schreiben/vorsichtig über seine Lage sein/oder um es zu kompilieren, wird ein solcher Versuch sein, um seine Selbstverbrennung anzuzünden. –

+0

@ K-ballo Das würde ich auch glauben. Aber ich hätte gerne einen Zeiger auf eine autoritative Quelle, die dies auf die eine oder andere Weise angibt. – owagh

Antwort

9

Ihr Programm weist ein undefiniertes Verhalten auf. Die Spezialisierung muss in jeder Übersetzungseinheit, in der sie verwendet wird, angegeben werden. C++ 11 §14.7.3/6:

Wenn eine Vorlage, eine Mitgliedervorlage oder ein Mitglied einer Klassenvorlage explizit spezialisiert ist dann muss diese Spezialisierung vor der ersten Verwendung dieser Spezialisierung deklariert werden, die eine implizite Instantiierung in jeder Übersetzungseinheit bewirken würde, in der eine solche Verwendung stattfindet; keine Diagnose ist erforderlich.