2012-12-19 22 views
6

chỉ vấp phải điều gì đó mà tôi không thể giải thích. Các mã sau đây không biên dịchViệc sử dụng điều này đôi khi có cần thiết không?

template<int a> 
class sub{ 
protected: 
    int _attr; 
}; 

template<int b> 
class super : public sub<b>{ 
public: 
    void foo(){ 
     _attr = 3; 
    } 
}; 

int main(){ 
    super<4> obj; 
    obj.foo(); 
} 

trong khi đó khi tôi thay đổi _attr = 3; để this->attr = 3; có vẻ là không có vấn đề.

Tại sao lại như vậy? Có trường hợp nào bạn phải sử dụng không?

tôi đã sử dụng g++ test.cpp -Wall -pedantic để biên dịch và tôi nhận được lỗi sau

test.cpp: in member function 'void super<b>::foo()': 
test.cpp:11:3: error: '_attr' was not declared in this scope 
+3

Đọc trên [hai giai đoạn tra cứu tên] (http://blog.llvm.org/2009/12/dreaded- hai pha-name-lookup.html). (Ngoài ra câu hỏi thường gặp này: [Tại sao tôi gặp lỗi khi lớp có nguồn gốc mẫu của tôi sử dụng thành viên mà nó thừa kế từ lớp mẫu cơ sở?] (Http://www.parashift.com/c++-faq/nondependent-name -lookup-members.html)) – ildjarn

Trả lời

7

Why is that? Are there any cases you must to use this?

Vâng, có một số trường hợp bạn cần phải sử dụng this. Trong ví dụ của bạn, khi trình biên dịch thấy _attr, nó sẽ tìm kiếm _attr bên trong lớp và không thể tìm thấy nó. Bằng cách thêm this-> bạn trì hoãn tra cứu cho đến khi thời gian khởi tạo cho phép trình biên dịch tìm thấy nó bên trong sub.

Một lý do rất phổ biến để sử dụng này là để giải quyết vấn đề nhập nhằng:

void foo (int i) 
{ 
    this->i = i; 
} 
+0

Cảm ơn. Đã biết về việc sử dụng mơ hồ nhưng thats mới ... – Ace7k3

Các vấn đề liên quan