3

2 フェーズ ルックアップの質問: このコードを作成するためのより総合的な方法、つまり、これらすべてのusingディレクティブを回避する方法はありますか? のようなusing CBase<T>;ものが欲しいのですが、受け入れられません。

#include <iostream>

template <typename T>
class CBase
{
protected:
    int a, b, c, d;   // many more...

public:
    CBase() {
        a = 123; c = 0;
    }
};


template <typename T>
class CDer : public CBase<T>
{
//  using CBase<T>;     // error, but this is what I would like
    using CBase<T>::a;
    using CBase<T>::b;
    //...

public:
    CDer() {
        std::cout << a << this->c;
    }
};


int main()
{
    CDer<int> cd;
}

私の実際のコードには、さらに多くのメンバー変数/関数があり、何らかの方法でより短いコードを記述できるかどうか疑問に思っていました。
もちろん、this->c構文を使用しても問題は解決しません...

ありがとう!


gcc 4.1 MacOS X 10.6

4

2 に答える 2

2

テストケースを減らしてから、3つのオプションを検討します

template<typename T> struct Base { int a; };

オプション1

template<typename T> struct Der : Base<T> {
  void f() { 
    int &ra = Der::a;
    // now use ra
  }
}

オプション2

template<typename T> struct Der : Base<T> {
  void f() { 
    // use this->a instead
    // or Der::a
  }
}

オプション3

// use your using declarations
于 2010-04-02T20:46:18.400 に答える
0

これらの変数のほとんどがパラメーター化されているようには見えません。CBaseそれらをすべて使用しますか、それとも 1 つだけ使用しますかa? そうでない場合は、それらを の新しい非テンプレート ベースに移動しますCDer

または、それらをすべて POD 構造体にパックしてからusing CBase<T>::m_ints;.

オーバーヘッドの高いソリューション: テンプレート化されていないvirtualベース。

よくわかりませんが、試してみる価値があります。CDer内部の定義をネストしてから、名前空間スコープに入れます。CBasetypedef

于 2010-04-02T22:31:03.917 に答える