简体   繁体   中英

template inheritance and member access

I have the following simple code:

template <typename T>
struct base
{
  std::vector<T> x;
};

template <typename T>
struct derived : base<T>
{
  void print()
    {
      using base<T>::x;     // error: base<T> is not a namespace
      std::cout << x << std::endl;
    }
};

When I compile the code (using GCC-4.7.2) I get the error that you see in the comment above.

I read here: http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Name-lookup.html#Name-lookup that

using base<T>::x

has to be included in order to bring in the scope of the base class. Any ideas what is wrong? Thank you in advance!

Put the using declaration in the class definition, not in the function body:

template <typename T>
struct derived : base<T>
{
    using base<T>::x;     // !!

    void print()
    {
        std::cout << x << std::endl;
    }
};

(Of course it's your responsibility to make sure that there's actually an operator<< overload for your std::vector , for example by using the pretty printer .)

You can also make it work if you explicitly say that x is a member:

template <typename T>
struct base
{
  std::vector<T> x;
  base() : x(1) {}
};

template <typename T>
struct derived : base<T>
{
  void print()
    {
      std::cout << this->x[0] << std::endl;
    }
};

int main()
{
    derived<int> d;
    d.print();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM