Usage of typename
May 26, 2014 · Commentscode c++
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.