Tôi gặp lỗi khi cố biên dịch lớp mẫu C ++ được phân tách giữa tệp .hpp
và .cpp
tệp:
$ 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
Đây là mã của tôi:
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
tất nhiên là đúng: các ký hiệu không ở trong stack.o
.
Câu trả lời cho câu hỏi này không giúp ích được gì, vì tôi đã làm như nó nói.
Điều này có thể hữu ích, nhưng tôi không muốn chuyển từng phương thức vào .hpp
tệp — tôi không cần phải làm vậy, phải không?
Có phải giải pháp hợp lý duy nhất để di chuyển mọi thứ trong .cpp
tệp vào .hpp
tệp và chỉ cần bao gồm mọi thứ, thay vì liên kết dưới dạng tệp đối tượng độc lập? Điều đó có vẻ xấu kinh khủng ! Trong trường hợp đó, tôi cũng có thể trở lại trạng thái trước đó của mình và đổi tên stack.cpp
thành stack.hpp
và hoàn tất với nó.