Jump to content

  • Log In with Google      Sign In   
  • Create Account

C++ Template Inheritance (accessing base member)


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 PolyVox   Members   -  Reputation: 708

Like
0Likes
Like

Posted 24 July 2011 - 02:07 AM

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!

Sponsor:

#2 Gasim   Members   -  Reputation: 207

Like
1Likes
Like

Posted 24 July 2011 - 02:21 AM

http://womble.decadent.org.uk/c++/template-faq.html#type-syntax-error

Here is some info on that.

Btw You can use:
return this->value; //compiled for me


#3 PolyVox   Members   -  Reputation: 708

Like
0Likes
Like

Posted 24 July 2011 - 05:05 AM

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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS