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

(もちろん、たとえばpretty printerを使用して、実際に が過負荷になっていることを確認するのはあなたの責任です。)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 に答える