Có hai giai đoạn trong mẫu instantiation ("Hai giai đoạn Tên Lookup").
Trong giai đoạn đầu tiên, tất cả các tên không phụ thuộc đều được giải quyết (tra cứu). Trong giai đoạn thứ hai, các tên phụ thuộc được giải quyết.
Một tên phụ thuộc là một cái tên mà phụ thuộc vào tham số mẫu ví dụ .:
template <typename T>
void foo() {
x = 0; // <- Non-dependent, nothing in that refers to "T".
// Thus looked up in phase 1, therefore, an 'x' must be
// visible.
T::x = 0; // <- Dependent, because it depends on "T".
// Looked up in phase 2, which is when it must be visible.
}
Bây giờ, bạn viết:
t = this->a; //Okay
t = a //Error
Đây là chính xác những gì tôi đã mô tả. Theo thuật ngữ không sao, t
được tra cứu trong giai đoạn 2, vì this
phụ thuộc vào thông số mẫu.
Cụm từ lỗi được tra cứu trong giai đoạn 1, bởi vì không có gì trong tên đó phụ thuộc vào thông số mẫu. Nhưng trong giai đoạn 1, không thể nhìn thấy a
vì trình biên dịch không thể xem xét các mẫu lớp cơ sở trong giai đoạn 1, vì các mẫu có thể chuyên biệt và tại thời điểm khởi tạo, có thể được điều khiển từ mẫu chính, một chuyên ngành khác không có số a
, có thể hiển thị.
Ví dụ:
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
Btw, tôi đã một lần bằng văn bản this-> is not only a matter of style trong blog của tần số rất thấp của tôi.
Nguồn
2012-04-16 09:19:10
Joachim Pileborg cho bạn câu trả lời. Ngoài ra, mã được cung cấp có các vấn đề khác ngăn không cho nó biên dịch. – Anonymous
Đây có phải là mã thực tế không?Không có dấu chấm phẩy sau khi định nghĩa lớp và toán tử phạm vi cho 'int B: f()' là không chính xác cộng với không dấu chấm phẩy ở dòng lỗi. –
hmjd
ồ, đó chỉ là lỗi đánh máy. Tôi sửa nó rồi. –