Verschachtelte Vorlagen mit abhängigem Bereich

80

Was ist der abhängige Bereich und welche Bedeutung hat der Typname im Zusammenhang mit dem folgenden Fehler?

$ 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;
}
user383352
quelle

Antworten:

124

Der Compiler hat Ihnen genau gesagt, was zu tun ist. Schreiben Sie typenamevorher ptrModel<std::vector<Data> >::Typewie folgt:

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

Der Grund für diese Anforderung ist, dass der Compiler zu diesem Zeitpunkt nicht weiß, ob ptrModel<std::vector<Data> >::Typeer eine Mitgliedsvariable oder einen verschachtelten Typ beschreibt. Es kann das nicht einmal herausfinden, wenn man sich die Definition von ansieht, ptrModelweil es möglicherweise eine Spezialisierung ptrModelfür std::vector<Data>irgendwo anders im Programm gibt, zu der es noch nicht gekommen ist, welche Änderungen sich auf welche dieser Dinge ::Typebeziehen. Sie müssen es also explizit angeben.

Der Name ptrModel<std::vector<Data> >::Typehat einen "abhängigen Bereich", da er sich in einem Bereich befindet, der von der Instanziierung einer Vorlage abhängt .

Tyler McHenry
quelle
6
Okay, aber ist es nicht wahr, dass es keinen Sinn macht, eine Mitgliedsvariable zu tippen?
user383352
5
Ja, aber das hilft nicht unbedingt, da einige Details darüber vorliegen, wie Vorlagen vom Compiler analysiert werden. Siehe die akzeptierte Antwort auf diese Frage: stackoverflow.com/questions/642229/…
Tyler McHenry
5
Ich fand diese Antwort auch sehr hilfreich, wenn ich zum ersten Mal auf diesen Fehler und dieses Konzept stieß.
Drew Noakes