sto ottenendo gli errori cercando di compilare una ++ classe template C che è diviso tra un .hpp
e .cpp
di file:Dividere le classi C++ basate su modelli in file .hpp/.cpp - è possibile?
$ 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
Ecco il mio codice:
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
è naturalmente corretto: i simboli non sono in stack.o
.
La risposta a this question non aiuta, come sto già facendo come si dice.
This one potrebbe aiutare, ma non voglio spostare ogni singolo metodo nel file .hpp
— Non avrei dovuto, dovrei?
È l'unica soluzione ragionevole per spostare tutto nel file .cpp
nel file .hpp
e includere semplicemente tutto, anziché collegarsi come file di oggetti autonomo? Quello sembra terribilmente brutto! In tal caso, potrei anche tornare al mio stato precedente e rinominare stack.cpp
in stack.hpp
e farlo con esso.
Esistono due soluzioni ottimali per quando si desidera mantenere il codice nascosto (in un file binario) o tenerlo pulito. È necessario ridurre la generalità anche se nella prima situazione. È spiegato qui: http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – Sheric