1. ホーム
  2. c++

派生テンプレートクラスによるベースクラスメンバーデータへのアクセス

2023-09-18 12:44:31

質問

この質問は、以下の質問に対する補足です。 このスレッド .

以下のクラス定義を使って

template <class T>
class Foo {

public:
    Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
    {
        /* do something for foo */
    }
    T Foo_T;        // either a TypeA or a TypeB - TBD
    foo_arg_t _foo_arg;
};

template <class T>
class Bar : public Foo<T> {
public:
    Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
    : Foo<T>(bar_arg)   // base-class initializer
    {

        Foo<T>::Foo_T = T(a_arg);
    }

    Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
    : Foo<T>(bar_arg)
    {
        Foo<T>::Foo_T = T(b_arg);
    }

    void BarFunc ();

};

template <class T>
void Bar<T>::BarFunc () {
    std::cout << _foo_arg << std::endl;   // This doesn't work - compiler error is: error: ‘_foo_arg’ was not declared in this scope
    std::cout << Bar<T>::_foo_arg << std::endl;   // This works!
}

テンプレートクラスのベースクラスのメンバにアクセスする場合、常にテンプレートスタイルの構文である Bar<T>::_foo_arg . これを避ける方法はあるのでしょうか?コードを単純化するために、テンプレートクラスのメソッドで'using'ステートメント/ディレクティブを使用することができますか?

編集してください。

this->構文で変数を修飾することで、スコープの問題を解決しています。

どのように解決するのですか?

この場合 this-> を使って、クラスのメンバを参照していることを明確にすることができます。

void Bar<T>::BarFunc () {
    std::cout << this->_foo_arg << std::endl;
}

また、"を使うこともできます。 using "をメソッド内で使用することもできます。

void Bar<T>::BarFunc () {
    using Bar<T>::_foo_arg;             // Might not work in g++, IIRC
    std::cout << _foo_arg << std::endl;
}

これにより、コンパイラはメンバ名がテンプレート・パラメータに依存していることを明確にし、適切な場所でその名前の定義を検索するようになります。より詳細な情報は C++ Faq Liteのこのエントリを参照してください。 .