Trong cả hai trường hợp, bạn đang thực hiện việc khởi tạo rõ ràng. Trong trường hợp thứ hai, chỉ ABC<char>::foo
đang được khởi tạo, trong khi trong trường hợp đầu tiên ABC<char>::bar
cũng được khởi tạo.
Một ví dụ tương tự khác có thể làm sáng tỏ ý nghĩa:
// test.h
template <typename T>
class ABC {
public:
void foo(T&);
void bar(T&);
};
// test.cpp
template <typename T>
void ABC<T>::foo(T&) {} // definition
template <typename T>
void ABC<T>::bar(T&) {} // definition
template void ABC<char>::foo(char &); // 1
template class ABC<char>; // 2
// main.cpp
#include "test.h"
int main() {
ABC<char> a;
a.foo(); // valid with 1 or 2
a.bar(); // link error if only 1, valid with 2
}
Trong ví dụ, trong main
trình biên dịch không thể nhìn thấy cũng không foo
bar
định nghĩa, vì vậy nó không thể nhanh chóng các phương pháp. Trình biên dịch, khi xử lý main.cpp sẽ chấp nhận mã trong chính sẵn sàng, vì bạn đang nói rằng ABC
là một khuôn mẫu và nó có hai hàm này, và sẽ giả định rằng chúng sẽ được định nghĩa trong một số đơn vị dịch thuật khác.
Trong đơn vị dịch có chứa test.cpp, trình biên dịch đang nhìn thấy cả hai định nghĩa phương thức và cả hai phiên âm (phương thức/lớp) đều có thể được xử lý hoàn toàn. Nếu chỉ có phương thức khởi tạo ([1]), trình biên dịch sẽ chỉ tạo ra phương thức đó và sẽ để lại bar
không xác định. Vì vậy, bất kỳ mã nào bao gồm test.h, các liên kết ngược với test.cpp được biên dịch và chỉ sử dụng phương thức foo
sẽ biên dịch và liên kết, nhưng việc sử dụng bar
sẽ không liên kết do nó không được xác định.
Tạo nhanh biểu mẫu lớp tạo ra các ký hiệu cho tất cả các phương thức thành viên và trong trường hợp đó, bất kỳ đơn vị dịch nào bao gồm test.h và liên kết ngược với tệp đối tượng test.cpp đã biên dịch sẽ biên dịch và liên kết.
Nguồn
2010-04-29 07:35:18
Tại sao bạn hỏi? Họ là hai câu nói khá không liên quan. –
@ Dennis Zickefoose: tất cả chúng ta đều là những người mới bắt đầu tại một số thời điểm – ereOn
@ereOn: Có, nhưng tại sao anh ta hỏi có thể đi một chặng đường dài hướng tới việc gợi ý một cách tiếp cận đúng đắn khi trả lời câu hỏi của anh ta. –