Jump to content
  • Advertisement
Sign in to follow this  
PolyVox

C++ Template Inheritance (accessing base member)

This topic is 2554 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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!

Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!