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