web-dev-qa-db-fra.com

Modèles imbriqués avec étendue dépendante

Quelle est la portée dépendante et quelle est la signification du nom de type dans le contexte de l'erreur suivante?

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

Le compilateur vous a dit exactement quoi faire. Écrivez typename avant ptrModel<std::vector<Data> >::Type, ainsi:

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

raison pour cette exigence est que le compilateur ne sait pas à ce stade si ptrModel<std::vector<Data> >::Type décrit une variable membre ou un type imbriqué. Il ne peut même pas comprendre cela en regardant la définition de ptrModel car il pourrait y avoir une spécialisation de ptrModel pour std::vector<Data> ailleurs dans le programme où il n'est pas encore arrivé, qui change laquelle de ces choses ::Type fait référence à. Vous devez donc le dire explicitement.

Le nom ptrModel<std::vector<Data> >::Type a une "portée dépendante" car c'est dans une portée qui dépend de l'instanciation d'un modèle.

123
Tyler McHenry