Tengo un problema extraño. En Windows, con Visual Studio 2010 y también con el compilador Intel todo está vinculado como se esperaba. Pero cuando intento compilar mi código con CLang 3.0 en Linux, compila (y si solo uso un solo archivo CPP, también lo vincula y lo ejecuta) pero no enlaza.Linux C++: ¿Cómo usar apropiadamente las especializaciones de plantillas en múltiples archivos?
El mensaje es que hay múltiples definiciones de símbolos, que se refieren a instancias de plantilla. Por ejemplo, consideremos las dos líneas siguientes en un archivo de cabecera compartida a través de múltiples unidades de compilación:
template<class T> void myFunc(T in) { }
template<> void myFunc<int>(int in) { }
Ahora desde el enlazador Linux me gustaría tener algo en la línea de:
"xyz archivo": múltiple definición de "myFunc (int in)", definido por primera vez en "algún archivo".
Pero, ¿cómo evitaría eso? Como funciona en Windows, supongo que también debería funcionar en Linux.
Lo mismo aplica para los miembros de datos de plantilla estáticos, que son más o menos los mismos que los anteriores simplemente declaran una variable en lugar de una función. Preferiría que funcionara para miembros de datos de plantilla estáticos.
Si todo lo demás falla, supongo que todavía podía crear un archivo "MakeAll.cpp" que acaba incluye CPP hay, pero eso no suena como una solución deseable para mí ...
Gracias por ¡tu ayuda!
¿Está utilizando #include guardias? –
@SteveC el usuario indica que el código compila pero no enlaza. Los guardias incluirían desencadenar errores de compilación en lugar de errores de tiempo de enlace. –