Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

problem with template inheritance

I'm trying to understand whay i get an error on this code: (the error is under g++ unix compiler. VS is compiling OK)

template<class T> class A {
public:
    T t;
public:
    A(const T& t1) : t(t1) {}
    virtual void Print() const { cout<<*this<<endl;}
    friend ostream& operator<<(ostream& out, const A<T>& a) {
            out<<"I'm "<<typeid(a).name()<<endl;
            out<<"I hold "<<typeid(a.t).name()<<endl;
            out<<"The inner value is: "<<a.t<<endl;
            return out;
    }
};

template<class T> class B : public A<T> {
public:
    B(const T& t1) : A<T>(t1) {}
    const T& get() const { return t; }
};

int main() {
    A<int> a(9);
    a.Print();
    B<A<int> > b(a); 
    b.Print();
    (b.get()).Print();  
    return 0;
}

This code is giving the following error:

main.cpp: In member function 'const T& B::get() const':
main.cpp:23: error: 't' was not declared in this scope

It did compiled when i changed the code of B to this:

template<class T> class B : public A<T> {
public:
    B(const T& t1) : A<T>(t1) {}
    const T& get() const { return A<T>::t; }
};

I just cant understand what is the problem with the first code...
It doesn't make sense that i really need to write "A::" every time...

like image 478
amiad Avatar asked Jun 06 '10 00:06

amiad


People also ask

Can template functions be inherited?

It is possible to inherit from a template class. All the usual rules for inheritance and polymorphism apply. If we want the new, derived class to be generic it should also be a template class; and pass its template parameter along to the base class.

What is template inheritance?

Template inheritance allows you to build a base “skeleton” template that contains all the common elements of your site and defines blocks that child templates can override. Sounds complicated but is very basic. It's easiest to understand it by starting with an example.


1 Answers

You can also use this->t to access the base class template member.

In B::get(), the name t is not dependent on the template parameter T, so it is not a dependent name. Base class A<T> is obviously dependent on the template parameter T and is thus a dependent base class. Nondependent names are not looked up in dependent base classes. A detailed description of why this is the case can be found in the C++ FAQ Lite.

like image 71
James McNellis Avatar answered Sep 28 '22 03:09

James McNellis