6

テンプレート派生クラスのテンプレート基本クラスのメンバーを使用する場合は、次のようにスコープに含める必要があります。

template <typename T>
struct base
{
    void foo();
};

template <typename T>
struct derived : base<T>
{
    using base<T>::foo;
};

他のusingステートメントのように、このusingステートメントをローカルスコープに配置できないのはなぜですか?

template <typename T>
struct base
{
    void foo();
};

template <typename T>
struct derived : base<T>
{
    void f()
    {
        using base<T>::foo;  // ERROR: base<T> is not a namespace
    }
};
4

2 に答える 2

2

関数スコープの目的はusing base<T>::foo、関数を呼び出したいことですがfoo、エラーが発生するため、それを行うことはできません。

ファンクトンを呼び出したい場合(そうでない場合はなぜそうするのか)、許可されている次のことを行うことができます。

this->template base<T>::foo(); //syntax 1
this->base<T>::foo();          //syntax 2 - simple
this->foo();                   //syntax 3 - simpler

ただし、これを書くことはできません。

foo() ;  //error - since foo is in base class template!
//if you write `using base<T>::foo` at class scope, it will work!

ideoneでのデモ:http ://www.ideone.com/vfDNs

これを読んで、関数呼び出しでキーワードを使用する必要がある場合を確認してください。template

テンプレートでの醜いコンパイラエラー

于 2011-02-24T05:07:16.340 に答える
1

標準(ドラフト3225)は次のように述べてい[namespace.udecl]ます:

クラスメンバーの使用宣言は、メンバー宣言でなければなりません。[ 例:

struct  X  {
    int  i;
    static  int  s;
};
void  f()  {
    using  X::i; // error:  X::i is a class member
                 // and this is not a member declaration.
    using  X::s; // error:  X::s is a class member
                 // and this is not a member declaration.
}

—終了例]

ただし、 using-directiveにはそのような制限はありません([namespace.udir]):

using-directiveで名前空間名を検索する場合、名前空間名のみが考慮されます。

于 2011-02-24T05:26:25.490 に答える