Beim Kompilieren einer C ++ - Vorlagenklasse, die zwischen a .hppund .cppfile aufgeteilt ist, werden Fehler angezeigt :
$ 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
Hier ist mein 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;
}
ldist natürlich richtig: die symbole sind nicht in stack.o.
Die Antwort auf diese Frage hilft nicht weiter, da ich bereits das tue, was es sagt.
Dies könnte helfen, aber ich möchte nicht jede einzelne Methode in die .hppDatei verschieben - ich sollte es nicht müssen, oder?
Ist die einzig vernünftige Lösung, alles in der .cppDatei in die .hppDatei zu verschieben und einfach alles einzuschließen, anstatt es als eigenständige Objektdatei zu verknüpfen? Das scheint schrecklich hässlich! In diesem Fall könnte ich zurückkommen und zu meinem vorherigen Zustand und Umbenennungs stack.cppzu stack.hppund mit ihr geschehen.