470,647 Members | 1,268 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,647 developers. It's quick & easy.

accessing base class members when base is template


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
2 1253
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
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.

Similar topics

25 posts views Thread by John Harrison | last post: by
2 posts views Thread by Simon White | last post: by
19 posts views Thread by jan.loucka | last post: by
reply views Thread by warner | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.