1

我有以下简单的代码:

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;
    }
};

当我编译代码(使用 GCC-4.7.2)时,我得到了您在上面的评论中看到的错误。

我在这里读到: http : //gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Name-lookup.html#Name-lookup

using base<T>::x

必须包含在基类的范围内。有什么想法有什么问题吗?先感谢您!

4

2 回答 2

7

using声明放在类定义中,而不是函数体中:

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

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

(当然,有责任确保您的 确实有operator<<过载std::vector,例如使用漂亮的打印机。)

于 2012-11-06T13:42:01.170 回答
4

x如果您明确表示它是成员,您也可以使其工作:

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();
}
于 2012-11-06T13:41:44.037 回答