C++ Template Inheritance (accessing base member)

Started by
1 comment, last by PolyVox 12 years, 8 months ago
Hi Guys,

I just need a quick C++ template sanity check. The following code compiles successfully on GCC:

#include <iostream>

using namespace std;

template <typename Type>
class Base
{
protected:
Type value;
};

template <typename Type>
class Derived : public Base<Type>
{
public:
Type getValue()
{
return Base<Type>::value;
}
};

int main(int argc, char** argv)
{
Derived<int> derived;
cout << "Hello " << derived.getValue() << endl;
return 0;
}


However, if I remove the 'Base<Type>::' part from inside getValue() then it no longer compiles. That is, the code:

#include <iostream>

using namespace std;

template <typename Type>
class Base
{
protected:
Type value;
};

template <typename Type>
class Derived : public Base<Type>
{
public:
Type getValue()
{
return value;
}
};

int main(int argc, char** argv)
{
Derived<int> derived
cout << "Hello " << derived.getValue() << endl;
return 0;
}


Gives the error:

main.cpp: In member function ‘Type Derived<Type>::getValue()’:
main.cpp:18: error: ‘value’ was not declared in this scope


This surprises me, as I didn't think you needed to clarify the variable in that way as it is a member of the base class.

If I modify the classes to not be templatised then I don't need the 'Base<Type>::' prefix, so why do I need it in the templated case? Is the mistake elsewhere - maybe I'm doing template inheritance wrong?

Thanks!
Advertisement
[font=Arial,]http://womble.decadent.org.uk/c++/template-faq.html#type-syntax-error[/font]

Here is some info on that.

Btw You can use:

return this->value; //compiled for me
Perfect, thanks for that great link. I'll bookmark that for the future.

Curiously it does appear to work on VS2010 (didn't test that exact example but something similar) so I guess GCC is just a little stricter. At least I now know it's the expected behaviour.

This topic is closed to new replies.

Advertisement