79 votes

Les modèles imbriqués avec dépendant de la portée

Ce qui est dépendante de la portée et quel est le sens de typename 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;
}

123voto

Tyler McHenry Points 35551

Le compilateur vous dit exactement quoi faire. Écrire typename avant ptrModel<std::vector<Data> >::Type, comme suit:

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

La raison de cette exigence est que le compilateur n'a pas à ce stade de savoir si ptrModel<std::vector<Data> >::Type explique un membre de la variable ou d'un type imbriqué. Il ne peut même pas la figure qui en regardant la définition de l' ptrModel car il y a peut être une spécialisation de l' ptrModel pour std::vector<Data> ailleurs dans le programme qu'il n'a pas eu encore d'changements de ces choses - ::Type se réfère. Si vous avez besoin de le dire explicitement.

Le nom de l' ptrModel<std::vector<Data> >::Type a un "dépendant de la portée" parce que c'est dans une mesure qui repose sur l'instanciation d'un modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X