2012-12-19 12 views
6

appena incappato in qualcosa che non so spiegare. Il seguente codice non viene compilatoL'utilizzo di questo a volte è necessario?

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

mentre quando cambio _attr = 3; a this->attr = 3; non sembra esserci alcun problema.

Perché è quello? Ci sono dei casi in cui devi usare questo?

ho usato g++ test.cpp -Wall -pedantic per compilare ed ottengo il seguente errore

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

Leggi su [a due fasi di ricerca del nome] (http://blog.llvm.org/2009/12/dreaded- bifase-nome-lookup.html). (Anche questa FAQ: [Perché sto ricevendo errori quando la mia classe derivata da template utilizza un membro che eredita dalla sua classe template-base?] (Http://www.parashift.com/c++-faq/nondependent-name -lookup-members.html)) – ildjarn

risposta

7

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

Sì, ci sono alcuni casi in cui è necessario utilizzare this. Nel tuo esempio, quando il compilatore vede _attr, prova a cercare _attr all'interno della classe e non riesce a trovarlo. Aggiungendo this-> è ritardo ricerca fino al tempo di istanza che consente al compilatore di trovarlo all'interno di sub.

Un altro motivo molto comune per utilizzare questo è quello di risolvere i problemi di ambiguità:

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

Grazie. Sapevo dell'uso dell'ambiguità ma questo è nuovo ... – Ace7k3

Problemi correlati