What is dependent scope and what is the meaning of typename in the context of the following error?
$ 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; }
The compiler told you exactly what to do. Write typename
before ptrModel<std::vector<Data> >::Type
, like so:
typedef typename ptrModel<std::vector<Data> >::Type Type;
The reason for this requirement is that the compiler doesn't at this point know whether ptrModel<std::vector<Data> >::Type
describes a member variable or a nested type. It can't even figure that out by looking at the definition of ptrModel
because there might be a specialization of ptrModel
for std::vector<Data>
somewhere else in the program that it hasn't gotten to yet which changes which of these things ::Type
refers to. So you need to tell it explicitly.
The name ptrModel<std::vector<Data> >::Type
has a "dependent scope" because it is in a scope that depends on the instantiation of a template.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With