2010-07-22 6 views
76

Was ist abhängig Bereich und was bedeutet Typname im Zusammenhang mit dem folgenden Fehler?Verschachtelte Vorlagen mit abhängigen Bereich

$ make 
g++ -std=gnu++0x main.cpp 
main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope 
make: *** [all] Error 1 


/* 
* main.cpp 
*/ 

#include <vector> 
#include <memory> 

template<typename T> 
struct ptrModel 
{ 
typedef std::unique_ptr<T> Type; 
}; 


template<typename Data> 
struct ptrType 
{ 
typedef ptrModel< std::vector<Data> >::Type Type; 
}; 

int main() 
{ 
return 0; 
} 

Antwort

118

Der Compiler sagte Ihnen genau, was zu tun ist. Schreiben typename vor ptrModel<std::vector<Data> >::Type, etwa so:

typedef typename ptrModel<std::vector<Data> >::Type Type; 

Der Grund für diese Anforderung ist, dass der Compiler an dieser Stelle nicht wissen, ob ptrModel<std::vector<Data> >::Type eine Membervariable oder eine verschachtelte Art beschreibt. Es kann nicht einmal durch die Definition von ptrModel herausfinden, da es eine Spezialisierung von ptrModel für std::vector<Data> woanders im Programm gibt, die es noch nicht bekommen hat, welche Änderungen welche dieser ::Type betrifft. Du musst es also explizit sagen.

Der Name ptrModel<std::vector<Data> >::Type hat einen "abhängigen Bereich", weil es in einem Bereich ist, der auf die Instanziierung einer Vorlage abhängt.

+6

In Ordnung, aber ist es nicht wahr, macht es keinen Sinn, eine Membervariable typedef einzugeben? – user383352

+5

Ja, aber das hilft nicht unbedingt aufgrund einiger Details darüber, wie Templates vom Compiler geparst werden. Siehe die akzeptierte Antwort auf diese Frage: http://stackoverflow.com/questions/642229/why-do-i-need-to-use-typedef-typename-in-g-but-not-vs –

+5

Ich fand auch [ Diese Antwort] (http://stackoverflow.com/a/6571836/24874) ist sehr hilfreich, wenn Sie zum ersten Mal auf diesen Fehler und dieses Konzept stoßen. –

Verwandte Themen