2012-12-19 14 views
6

natknąłem się na coś, czego nie potrafię wyjaśnić. Poniższy kod nie kompilujeKorzystanie z tego czasami jest konieczne?

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(); 
} 

natomiast gdy mogę zmienić _attr = 3; do this->attr = 3; wydaje się, że nie ma problemu.

Dlaczego tak jest? Czy są jakieś przypadki, w których musisz użyć tego?

użyłem g++ test.cpp -Wall -pedantic skompilować i pojawia się następujący błąd

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

Poczytaj na ten temat [nazwa dwufazowym odnośnika] (http://blog.llvm.org/2009/12/dreaded- dwufazowa nazwa-lookup.html). (Również niniejsze FAQ: [Dlaczego otrzymuję błędy, gdy moja klasa pochodna szablonu używa członka, który dziedziczy po swojej klasie bazującej na szablonie?] (Http://www.parashift.com/c++-faq/nondependent-name -lookup-members.html)) – ildjarn

Odpowiedz

7

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

Tak, istnieją pewne przypadki, w których trzeba użyć this. W twoim przykładzie, gdy kompilator zobaczy _attr, spróbuje poszukać _attr w klasie i nie może go znaleźć. Dodając this-> ty wyszukiwanie opóźnienia wyszukiwania aż do czasu wystąpienia, co pozwala kompilator znaleźć go wewnątrz sub.

Innym bardzo częstym powodem używać to, aby rozwiązać problemy dwuznaczność:

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

Dzięki. Wiedziałem o używaniu niejednoznaczności, ale to nowe ... – Ace7k3

Powiązane problemy