2014-05-05 11 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; 
} 

Wenn ich versuche, diese auf Xcode zu kompilieren 5 i erhaltenenable_shared_from_this nicht arbeiten an Xcode 5

Use of undeclared identifier 'shared_from_this' 

ich sie und ihre Arbeiten auf Visual Studio 2010.

+0

Sie haben vergessen, es mit 'std ::' wie so 'std :: shared_from_this()' zu qualifizieren. –

+0

Nein hier std Namespace nur für die Erweiterung von enable_shared_from_this und im Gegenzug Typ von getMe Funktion erforderlich und sie sind bereits eingegeben. –

+0

Plus shared_from_this ist Mitglied Funktion auf enable_shared_from_this Klasse. Sind Sie sicher, dass Sie die Frage lesen? –

Antwort

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

VC getestet ++ 2010 implementiert die Suchregeln für Vorlagenbasisklassen nicht exakt richtig. Das Klangverhalten ist korrekt. Der obige Fix wird es auf beiden Plattformen funktionieren lassen.

+1

+1, so dass es einfacher ist, nach mehr verwandten Informationen zu googeln, ist dies ein Problem bei der Suche nach * abhängigen * und * nicht abhängigen * Namen. Ohne die Qualifikation 'shared_from_this' ist ** nicht ** ein abhängiger Name. –

+0

Vielen Dank! Das hat den Trick gemacht. Ich verstehe immer noch nicht, warum es "das" hier braucht. Irgendein Dokument, um dafür zu überprüfen? –

+1

@ali_nakipoglu: Nun, es gibt immer den Standard ... insbesondere 14.6.2/3 * Wenn eine Basisklasse in der Definition einer Klassen- oder Klassenvorlage von einem Template-Parameter abhängt, wird der Basisklassenbereich nicht untersucht während der Suche nach unqualifiziertem Namen, entweder an der Stelle der Definition der Klassenvorlage oder des Members oder während einer Instanziierung der Klassenvorlage oder des Members. * Sie können jedoch auch nach einer Zweiphasen-Suche googlen. –