25

次のようなクラスがあるとします。

class A {
public:
    class B {
        // ...
    };
    static void f();
    // ...
};

BasA::Bおよびf()asを参照できますが、グローバル/現在の名前空間にandA::f()をインポートできますか? 私は試したBf()

using A::B;

しかし、それは私にコンパイルエラーを与えました。

4

3 に答える 3

33

問題の 2 つの回避策を次に示します。

1)クラス B:

typedef A::B B;

2)関数 f():

inline void f()
{
    A::f();
}

しかし、それらを使用する前によく考えてください。

編集: C++ 11ではできますauto f = A::f;が、これは実際には関数へのポインターを作成し、関数ポインターはインライン化できません。

于 2012-07-25T10:35:20.443 に答える
19

クラスの名前空間エイリアスを使用できるはずです。

using B = A::B;

ただし、静的メンバー関数であっても、メンバー関数ではそれを行うことはできません。

編集:この SO 回答 (C++11 での「typedef」と「使用」の違いは何ですか)によると、これ有効である必要があり、実際には同じ方法で型エイリアスを作成typedefします。ただし、C++11 のみです。


C++11 の静的メンバー関数には、静的関数を指す変数を宣言することによる回避策があります。

struct Foo
{
    static void bar()
        { }
};

auto bar = Foo::bar;

編集:もちろん、静的メンバー関数を指すグローバル変数を持つことは、古い C++ 標準でも可能ですが、autoC++11 のキーワードを使用するよりも面倒です。上記の例では、次のようになります。

void (*bar)() = Foo::bar;
于 2012-07-25T10:41:05.363 に答える
10

あなたはできるtypedef

typedef A::B B;
于 2012-07-25T10:09:50.273 に答える