Có một cách sử dụng chưa được đề cập trong C ++ và đó là không đề cập đến đối tượng riêng hoặc định hướng một thành viên từ một biến nhận được.
Bạn có thể sử dụng this
để chuyển đổi một tên không phụ thuộc thành tên phụ thuộc đối số bên trong các lớp mẫu kế thừa từ các mẫu khác.
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
Mẫu được biên dịch với một cơ chế hai vượt qua. Trong lần truyền đầu tiên, chỉ các tên phụ thuộc không đối số được giải quyết và kiểm tra, trong khi các tên phụ thuộc chỉ được kiểm tra để kết hợp, mà không thực sự thay thế các đối số mẫu.
Ở bước đó, không thực sự thay thế loại, trình biên dịch gần như không có thông tin về những gì base<T>
có thể (lưu ý rằng việc chuyên môn hóa mẫu cơ sở có thể biến nó thành các loại hoàn toàn khác nhau, thậm chí các loại không xác định), vì vậy nó chỉ giả định rằng đó là một loại . Ở giai đoạn này, cuộc gọi không phụ thuộc f
có vẻ tự nhiên đối với lập trình viên là một biểu tượng mà trình biên dịch phải tìm thấy như một thành viên của derived
hoặc trong các không gian tên kèm theo - trong đó không xảy ra trong ví dụ-- và nó sẽ phàn nàn.
Giải pháp là biến tên không phụ thuộc f
thành tên phụ thuộc. Điều này có thể được thực hiện theo một vài cách, bằng cách nêu rõ loại hình được triển khai ( base<T>::f
- việc base<T>
tạo biểu tượng phụ thuộc vào T
và trình biên dịch sẽ chỉ cho rằng nó sẽ tồn tại và hoãn kiểm tra thực tế cho lần vượt qua thứ hai, sau thay thế đối số.
Cách thứ hai, sắp xếp nhiều hơn nếu bạn kế thừa từ các mẫu có nhiều hơn một đối số hoặc tên dài, chỉ là thêm một this->
trước biểu tượng. Vì lớp mẫu mà bạn đang triển khai không phụ thuộc vào một đối số (nó kế thừa từ base<T>
) this->
phụ thuộc vào đối số và chúng tôi nhận được kết quả tương tự: this->f
được kiểm tra trong vòng thứ hai, sau khi thay thế tham số mẫu.
this
tại MSDN. Vui lòng theo liên kết này ... ;-)