By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,194 Members | 817 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,194 IT Pros & Developers. It's quick & easy.

accessing base class members when base is template

P: n/a

Hi,

If I have the following:

template<class T>
class A
{
public:
int a;
};

template<class T>
class B : public A<T>
{
public:
void test()
{
A<T>::a=5;
}
};
I see I need to do A<T>::a=5 in B<T>::test(). With non-template
inheritance, this isn't needed - can just to a=5.

I guess there is a good reason for this, unless I am missing something
silly, but could anyone explain a bit why, or point to further
reference?

Thanks

Jun 22 '06 #1
Share this Question
Share on Google+
2 Replies


P: n/a
flopbucket wrote:
Hi,

If I have the following:

template<class T>
class A
{
public:
int a;
};

template<class T>
class B : public A<T>
{
public:
void test()
{
A<T>::a=5;
}
};
I see I need to do A<T>::a=5 in B<T>::test(). With non-template
inheritance, this isn't needed - can just to a=5.


You could also use this->a = 5;
Jun 22 '06 #2

P: n/a
flopbucket wrote:
...
template<class T>
class A
{
public:
int a;
};

template<class T>
class B : public A<T>
{
public:
void test()
{
A<T>::a=5;
}
};
I see I need to do A<T>::a=5 in B<T>::test(). With non-template
inheritance, this isn't needed - can just to a=5.

I guess there is a good reason for this, unless I am missing something
silly, but could anyone explain a bit why, or point to further
reference?
...


When it comes to templates, there's a notion of 'dependent name' in C++
language. Dependent names, as is easy to guess, depend on the
parameterized (i.e. template) portions of the type. Such names are
generally resolved at "later" stages when all parameterized portions of
the type are known. Other (i.e. non-dependent) names are resolved
immediately.

When you just say 'a' in your 'test()' method, the name 'a' is treated
as a non-dependent name. For this reason, the compiler resolves this
name immediately, without considering the parametrized base class. If
you have no matching declaration in scope, the compiler will complain
with an error (that's what you probably get). If you declare a global
variable (say, 'int a') before the declaration of 'B', the name 'a' in
'test()' will be treated as if refers to that global 'a', not to the
'A<T>::a'. That happens, once again, because a simple non-qualified 'a'
is not considered to be a dependent name.

If you want to make the compiler to treat 'a' as a dependent name, you
have to give it a hint. One way to do it is to use a fully qualified
name 'A<T>::a'. Another way to do it to refer to it as 'this->a'.

--
Best regards,
Andrey Tarasevich
Jun 23 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.