Recibo errores al intentar compilar una clase de plantilla C ++ que se divide entre un archivo .hpp
y .cpp
:
$ g++ -c -o main.o main.cpp
$ g++ -c -o stack.o stack.cpp
$ g++ -o main main.o stack.o
main.o: In function `main':
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()'
main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'
collect2: ld returned 1 exit status
make: *** [program] Error 1
Aquí está mi código:
stack.hpp :
#ifndef _STACK_HPP
#define _STACK_HPP
template <typename Type>
class stack {
public:
stack();
~stack();
};
#endif
stack.cpp :
#include <iostream>
#include "stack.hpp"
template <typename Type> stack<Type>::stack() {
std::cerr << "Hello, stack " << this << "!" << std::endl;
}
template <typename Type> stack<Type>::~stack() {
std::cerr << "Goodbye, stack " << this << "." << std::endl;
}
main.cpp :
#include "stack.hpp"
int main() {
stack<int> s;
return 0;
}
ld
es, por supuesto, correcto: los símbolos no están stack.o
.
La respuesta a esta pregunta no ayuda, ya que estoy haciendo lo que dice.
Este podría ayudar, pero no quiero mover todos y cada uno de los métodos al .hpp
archivo; no debería tener que hacerlo, ¿verdad?
¿Es la única solución razonable mover todo en el .cpp
archivo al .hpp
archivo y simplemente incluir todo, en lugar de vincularlo como un archivo de objeto independiente? ¡Eso parece terriblemente feo! En ese caso, yo también podría volver a mi estado anterior y el cambio de nombre stack.cpp
a stack.hpp
y hacerse con él.