2012-06-21 25 views
6

Mam te pliki: -Specjalizacja szablonów w innym pliku C++. Która wersja dostaje

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

Teraz kompiluję i uruchamiam te z g ++ w ten sposób: -

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

I otrzymujemy: -

for ints only 

Z drugiej strony, ja go skompilować z ICPC tak: -

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

I otrzymujemy: -

generic 

Co mówi o tym standard C++? Czy któryś z kompilatorów jest "prawidłowy", a drugi "zły", czy jest standardowy niejednoznaczny w tej kwestii i oba są "prawidłowe"?

+0

Chciałbym wierzyć _G ++ _ jest tutaj, ale nieokreślone ziemie zachowania są trudne ... –

+2

W wymowne słowa standardu języka C++: Podczas pisania specjalizacji/być ostrożny o jego lokalizacji/albo sprawić, że będzie to taka próba/by rozpalić jej samopodpalenie. –

+0

@ K-ballo W to też wierzę. Ale chciałbym wskazówkę do autorytatywnego źródła, które mówi w ten czy inny sposób. – owagh

Odpowiedz

9

Twój program wykazuje niezdefiniowane zachowanie. Specjalizacja musi być zadeklarowana w każdej jednostce tłumaczeniowej, w której jest używana, zgodnie z C++ 11 §14.7.3/6:

Jeśli szablon, szablon członkowski lub członek szablonu klasy jest wyraźnie wyspecjalizowany wówczas specjalizacja ta zostanie zadeklarowana przed pierwszym użyciem tej specjalizacji, która spowodowałaby wystąpienie implicite, w każdej jednostce tłumaczeniowej, w której takie użycie ma miejsce; diagnostyka nie jest wymagana.

Powiązane problemy