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 .hppvà .cpptệ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;
}
ldtấ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 .hpptệ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 .cpptệp vào .hpptệ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.cppthành stack.hppvà hoàn tất với nó.