且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

模板继承和成员访问

更新时间:2023-02-15 15:53:27

在类中使用声明而不是在函数体中:

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

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

(当然是负责确保实际上 std :: vector 重载code>,例如使用 pretty打印机。)


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.)