Using a templated parameter's value_type

You have to use typename:

typename T::value_type pop()

and so on.

The reason is that the compiler cannot know whether T::value_type is a type of a member variable (nobody hinders you from defining a type struct X { int value_type; }; and pass that to the template). However without that function, the code could not be parsed (because the meaning of constructs changes depending on whether some identifier designates a type or a variable, e.g.T * p may be a multiplication or a pointer declaration). Therefore the rule is that everything which might be either type or variable and is not explicitly marked as type by prefixing it with typename is considered a variable.


Use the typename keyword to indicate that it's really a type.

void push(typename T::value_type& item)

typename T::value_type pop()

Tags:

C++

Templates

Std