Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > accessing base class members when base is template

Reply
Thread Tools

accessing base class members when base is template

 
 
flopbucket
Guest
Posts: n/a
 
      06-22-2006

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

 
Reply With Quote
 
 
 
 
red floyd
Guest
Posts: n/a
 
      06-22-2006
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;
 
Reply With Quote
 
 
 
 
Andrey Tarasevich
Guest
Posts: n/a
 
      06-23-2006
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
base class public type (non template and template base class) Hicham Mouline C++ 1 04-20-2009 03:28 PM
r H2 deduce deduce template argument of a template class inheritingfrom a non template base? nguillot C++ 5 03-08-2009 05:56 PM
Accessing derived class members from base class Bhawna C++ 7 08-26-2008 11:03 AM
A parameterized class (i.e. template class / class template) is not a class? christopher diggins C++ 16 05-04-2005 12:26 AM
Can nested class members access private members of nesting class? CoolPint C++ 8 12-14-2003 02:30 PM



Advertisments