2012-12-19 4 views
6

stolperte gerade über etwas, das ich nicht erklären kann. Der folgende Code lässt sich nicht kompilierenVerwendung von diesem manchmal notwendig?

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

während, wenn ich ändern _attr = 3; zu this->attr = 3; es scheint kein Problem zu sein.

Warum ist das? Gibt es Fälle, in denen Sie das verwenden müssen?

verwendete ich g++ test.cpp -Wall -pedantic zu kompilieren und zu bekomme ich folgende Fehler

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

Informieren Sie sich über [Zweiphasen-Namen-Suche] (http://blog.llvm.org/2009/12/dreaded- Zwei-Phasen-name-lookup.html). (Auch diese FAQ: [Warum bekomme ich Fehler, wenn meine von der Vorlage abgeleitete Klasse ein Mitglied verwendet, das sie von ihrer Vorlage-Basisklasse erbt?] (Http://www.parashift.com/c++faq/nondependent-name -lookup-members.html)) – ildjarn

Antwort

7

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

Ja, es gibt einige Fälle, in denen Sie verwenden this benötigen. Wenn der Compiler in Ihrem Beispiel _attr sieht, versucht er innerhalb der Klasse nach _attr zu suchen und kann ihn nicht finden. Durch Hinzufügen this-> Sie Verzögerung Suche bis zur Instanziierungszeit, die der Compiler es innerhalb von sub finden kann.

Ein weiterer sehr häufiger Grund, dies zu verwenden ist Mehrdeutigkeit Probleme zu lösen:

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

Danke. Wusste über die Ambiguitätsnutzung, aber das ist neu ... – Ace7k3

Verwandte Themen