What is wrong with the following code?

The issue is very simple but hard to notice. If you try to compile this, you will get the following errors:

    main.cpp:24:5: error: need 'typename' before 'OuterStruct<T2>::InnerStruct' because 'OuterStruct<T2>' is a dependent scope
    OuterStruct<T2>::InnerStruct mUsingInner;
    ^
    main.cpp: In function 'int main(int, char**)':
    main.cpp:34:13: error: 'struct InnerStruct_Wrapper<int>' has no member named 'mUsingInner'
    wrapper.mUsingInner = innerStrct;

The Issue

At least it straight away tells you something is wrong with InnerStruct_Wrapper. Here’s what is happening:

  • The compiler does not know that mUsingInner in that line is actually a variable of type “OuterStruct::InnerStruct”

  • InnerStruct will only be known later when it is being instantiated

  • Compiler cannot figure out what InnerStruct means here. It could be a type or a member variable

The Fix

The only way here is to help the compiler by telling it beforehand that is going to be a class or struct type. The way to tell the compiler that something like this is supposed to be a type name is to throw in the keyword “typename”. The “typename” keyword has to be used everytime you want to tell the compiler that it should expect a Type in its place.

One place where this is used quite a lot is when templates have to implement iterators.

Full Code

The full sample code, along with the fix is provided on Stacked-Crooked.