2014-05-05 3 views
5
#include <iostream> 
#include <memory> 

template<typename T> 
class Test: public std::enable_shared_from_this< Test<T> > 
{ 

public: 

    std::shared_ptr< Test<T> > getMe() 
    { 
     return shared_from_this(); 
    }; 

}; 

int main(int argc, const char * argv[]) 
{ 
    Test<int> aTest; 

    return 0; 
} 

Quando provo a compilare questo su Xcode 5 ottengoenable_shared_from_this non funziona su Xcode 5

Use of undeclared identifier 'shared_from_this' 

ho provato e il suo funzionamento su Visual Studio 2010.

+0

Hai dimenticato di qualificarlo con 'std ::' così come 'std :: shared_from_this()'. –

+0

No qui lo spazio dei nomi std è richiesto solo per l'estensione da enable_shared_from_this e nel tipo restituito della funzione getMe e sono già stati digitati. –

+0

Plus shared_from_this è una funzione membro su enable_shared_from_this class. Sei sicuro di leggere la domanda? –

risposta

11
return this->shared_from_this(); 
      ^^^^^^ 

VC++ 2010 non implementa correttamente le regole di ricerca per le classi di base basate su modelli. Il comportamento clang è corretto. La correzione sopra funzionerà su entrambe le piattaforme.

+1

+1, in modo che sia più facile andare su Google per ulteriori informazioni correlate, questo è un problema con la ricerca dei nomi * dependent * e * non-dependent *. Senza la qualifica 'shared_from_this' è ** non ** un nome dipendente. –

+0

Grazie mille! Questo è stato il trucco. Ancora non capisco perché abbia bisogno di "questo" qui. Qualche documento da controllare per questo? –

+1

@ali_nakipoglu: Beh, c'è sempre lo standard ... in particolare 14.6.2/3 * Nella definizione di un modello di classe o classe, se una classe base dipende da un parametro template, l'ambito della classe base non viene esaminato durante la ricerca di nomi non qualificati al punto di definizione del modello di classe o membro o durante un'istanza del modello di classe o membro. * Ma puoi anche google per la ricerca a due fasi. –