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

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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.