Saya mendapatkan kesalahan saat mencoba mengompilasi kelas template C ++ yang terbagi antara a .hpp
dan .cpp
file:
$ 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
Ini kode saya:
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
tentu saja benar: simbolnya tidak ada stack.o
.
Jawaban atas pertanyaan ini tidak membantu, karena saya sudah melakukan apa yang dikatakan.
Yang ini mungkin membantu, tetapi saya tidak ingin memindahkan setiap metode ke dalam .hpp
file — saya tidak perlu melakukannya, bukan?
Apakah satu-satunya solusi yang masuk akal untuk memindahkan semua yang ada di .cpp
file ke .hpp
file, dan hanya menyertakan semuanya, daripada menautkannya sebagai file objek yang berdiri sendiri? Kelihatannya sangat jelek! Dalam hal ini, saya mungkin juga kembali ke keadaan sebelumnya dan mengganti nama stack.cpp
menjadi stack.hpp
dan selesai dengannya.