Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested templates with dependent scope

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; } 
like image 341
user383352 Avatar asked Jul 22 '10 17:07

user383352


1 Answers

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.

like image 166
Tyler McHenry Avatar answered Sep 19 '22 03:09

Tyler McHenry