2012-06-21 9 views
6

tengo estos archivos: -especialización de plantilla en otro archivo C++. ¿Qué versión Obtiene

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

Ahora, compilo y corro estos con g ++ como este: -

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

Y consigo: -

for ints only 

Por otro lado, puedo compilar con icpc así: -

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

Y consigo: -

generic 

¿Qué dice el estándar C++ sobre esto? ¿Hay algún compilador "correcto" y el otro "incorrecto" o el estándar es ambiguo sobre este tema y ambos son "correctos"?

+0

me creería _g _ ++ es aquí, pero las tierras comportamiento indefinido son difíciles ... –

+2

En las elocuentes palabras del lenguaje estándar C++: Al escribir una especialización/ tener cuidado acerca de su ubicación/o para hacer que compile/será una prueba/como para encender su autoinmolación. –

+0

@ K-ballo Eso es lo que yo también creo. Pero me gustaría un puntero a una fuente autorizada que lo diga de una manera u otra. – owagh

Respuesta

9

Su programa muestra un comportamiento indefinido. La especialización debe declararse en cada unidad de traducción en la que se utiliza, según C++ 11 §14.7.3/6:

Si una plantilla, una plantilla de miembro o un miembro de una plantilla de clase están explícitamente especializados entonces esa especialización se declarará antes del primer uso de esa especialización que causaría una instanciación implícita, en cada unidad de traducción en la que se produce dicho uso; no se requiere diagnóstico.

Cuestiones relacionadas