1

この単純なクラス階層では、クラス C に「B::x を使用して」と伝えることでどの x を使用するかを明確にしようとしていますが、これは G++ でコンパイルされません。関数 foo. using を使用して非表示のメソッドを促進できることは知っていますが、変数を使用できないのはなぜですか? クラス X を X の定義を持つ A と B の仮想ベースとして作成することを検討しましたが、それは厳密には私が望むものではありません。私が欲しいのは、B から派生した場合を除いて、直接派生したものによって使用される A:x です。Python がメンバー (名前) 解決順序アルゴリズムで行う方法と似ています (最後のクラスが勝つため、この場合は B:xが使用されます。説明についてはhttp://starship.python.net/crew/timehorse/BFS_vs_MRO.htmlを参照してください。)

ISO C++ 2011 にはこの点で欠陥があるという私の評価は正しいでしょうか。「使用」を使用して基本メンバー変数を明確にすることは不可能ですか?

class A {
protected:
    int x;
};

class B {
protected:
    int x;
};

class C : public A, public B {
protected:
    using B::x;

public:
    int foo(void) { return x; }
};

編集: コンパイラのバージョン: g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

4

1 に答える 1

0

C++11 および g++ 4.8 で問題なく動作します: http://ideone.com/oF4ozq

#include <iostream>
using namespace std;
class A {
protected:
    int x = 5 ;
};

class B {
protected:
    int x = 42 ;
};

class C : public A, public B {
protected:
    using B::x;

public:
    int foo(void) { return x; }
    int fooa(void) { return A::x; }
     int foob(void) { return B::x; }
};
int main() {
    C c;
    std::cout<<c.foo()<<std::endl;
    std::cout<<c.fooa()<<std::endl;
    std::cout<<c.foob()<<std::endl;
    return 0;
}
于 2014-04-15T09:32:19.607 に答える