J'obtiens des erreurs en essayant de compiler une classe de modèle C++ qui est divisée entre une classe de modèle et une classe de modèle. .hpp
y .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 correcte : les symboles ne sont pas dans stack.o
.
La réponse à cette question ne m'aide pas, car je fais déjà ce qui est indiqué.
Celui-là pourrait aider, mais je ne veux pas déplacer toutes les méthodes dans la section .hpp
Je ne devrais pas avoir à le faire, n'est-ce pas ?
Est-ce que la seule solution raisonnable est de déplacer tout ce qui est dans le .cpp
vers le fichier .hpp
et simplement tout inclure, plutôt que de le lier comme un fichier objet autonome ? Cela semble terriblement C'est moche ! Dans ce cas, je pourrais aussi bien revenir à mon état précédent et renommer stack.cpp
a stack.hpp
et en finir avec ça.
0 votes
Il existe deux excellentes solutions de contournement pour les cas où vous voulez vraiment garder votre code caché (dans un fichier binaire) ou le garder propre. Il est nécessaire de réduire la généralité bien que dans la première situation. Elle est expliquée ici : stackoverflow.com/questions/495021/
1 votes
L'instanciation explicite des modèles est la façon dont vous pouvez réduire le temps de compilation des modèles : stackoverflow.com/questions/2351148/