Nested templates with dependent scope

C++TemplatesScopeNested

C++ Problem Overview


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

C++ Solutions


Solution 1 - C++

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser383352View Question on Stackoverflow
Solution 1 - C++Tyler McHenryView Answer on Stackoverflow