Je reçois des erreurs en essayant de compiler une classe de modèle C ++ qui est divisée entre un .hpp
et un .cpp
fichier:
$ 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
Voici mon code:
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
est bien sûr correct: les symboles ne sont pas inclus stack.o
.
La réponse à cette question n'aide pas, comme je fais déjà ce qu'elle dit.
Celui-ci pourrait aider, mais je ne veux pas déplacer chaque méthode dans le .hpp
fichier - je ne devrais pas avoir à le faire, n'est-ce pas?
La seule solution raisonnable est-elle de déplacer tout ce qui se trouve dans le .cpp
fichier vers le .hpp
fichier, et de tout inclure simplement, plutôt que de créer un lien en tant que fichier objet autonome? Cela semble terriblement moche! Dans ce cas, je pourrais aussi bien revenir à mon état précédent et renommage stack.cpp
à stack.hpp
et faire avec elle.