7

次の C++ コードを考えてみましょう。

template <typename Derived>
struct A
{
    bool usable_;
};

template <typename Derived>
struct B : A< B<Derived> >
{
    void foo()
    {
        usable_ = false;
    }
};

struct C : B<C>
{
    void foo()
    {
        usable_ = true;
    }
};

int main()
{
    C c;
}

コンパイル エラーが発生しました: In member function void B<Derived>::foo():

template_inherit.cpp:12: エラー: 'usable_' はこのスコープで宣言されていません。

何故ですか ?良い修正はありますか?

4

1 に答える 1

14

これusable_は、 が非依存の名前であるため、インスタンス化 (基本クラスがわかっている場合) で検索されるのではなく、テンプレートが解析されるときに検索されます。

修飾されていない名前の検索は検索されず、非依存の名前は依存する基本クラスで検索されません。次のように名前をusable_依存させることができます。これにより、修飾されていない名前のルックアップも削除されます

this->usable_ = false;

// equivalent to: A<B>::usable_ = false;
A< B<Derived> >::usable_ = false;

B::usable_ = false;

これらはすべて機能します。または、using 宣言を使用して派生クラスで名前を宣言することもできます

template <typename Derived>
struct B : A< B<Derived> >
{
    using A< B<Derived> >::usable_;

    void foo()
    {
        usable_ = false;
    }
};

Cに問題はないことに注意してください。影響するのは のみBです。

于 2010-11-17T23:10:45.727 に答える