Biblioteca compartida de C ++ con plantillas: error de símbolos indefinidos
Estoy intentando enlazar a una biblioteca compartida con una clase de plantilla, pero me está dando errores de "símbolos indefinidos". He condensado el problema a unas 20 líneas de código.
compartido.h
<code>template <class Type> class myclass { Type x; public: myclass() { x=0; } void setx(Type y); Type getx(); }; </code>
shared.cpp
<code>#include "shared.h" template <class Type> void myclass<Type>::setx(Type y) { x = y; } template <class Type> Type myclass<Type>::getx() { return x; } </code>
main.cpp
<code>#include <iostream> #include "shared.h" using namespace std; int main(int argc, char *argv[]) { myclass<int> m; cout << m.getx() << endl; m.setx(10); cout << m.getx() << endl; return 0; } </code>
Así es como compilo la biblioteca:
<code>g++ -fPIC -c shared.cpp -o shared.o g++ -dynamiclib -Wl,-dylib_install_name -Wl,libshared.dylib -o libshared.dylib shared.o </code>
Y el programa principal:
<code>g++ -c main.cpp g++ -o main main.o -L. -lshared </code>
Solo para obtener los siguientes errores:
<code>Undefined symbols: "myclass<int>::getx()", referenced from: _main in main.o _main in main.o "myclass<int>::setx(int)", referenced from: _main in main.o </code>
Si elimino las cosas de 'plantilla' enshared.h/cpp
, y reemplazarlos con solo 'int', todo funciona bien. Además, si solo copio y pego el código de la clase de plantilla enmain.cpp
, y no enlazar a la biblioteca compartida, todo funciona también.
¿Cómo puedo obtener una clase de plantilla como esta para trabajar a través de una biblioteca compartida?
Estoy usando MacOS 10.5 con GCC 4.0.1.