次のようなクラスがあるとします。
class A {
public:
class B {
// ...
};
static void f();
// ...
};
B
asA::B
およびf()
asを参照できますが、グローバル/現在の名前空間にandA::f()
をインポートできますか? 私は試したB
f()
using A::B;
しかし、それは私にコンパイルエラーを与えました。
次のようなクラスがあるとします。
class A {
public:
class B {
// ...
};
static void f();
// ...
};
B
asA::B
およびf()
asを参照できますが、グローバル/現在の名前空間にandA::f()
をインポートできますか? 私は試したB
f()
using A::B;
しかし、それは私にコンパイルエラーを与えました。
問題の 2 つの回避策を次に示します。
1)クラス B:
typedef A::B B;
2)関数 f():
inline void f()
{
A::f();
}
しかし、それらを使用する前によく考えてください。
編集: C++ 11ではできますauto f = A::f;
が、これは実際には関数へのポインターを作成し、関数ポインターはインライン化できません。
クラスの名前空間エイリアスを使用できるはずです。
using B = A::B;
ただし、静的メンバー関数であっても、メンバー関数ではそれを行うことはできません。
編集:この SO 回答 (C++11 での「typedef」と「使用」の違いは何ですか)によると、これは有効である必要があり、実際には同じ方法で型エイリアスを作成typedef
します。ただし、C++11 のみです。
C++11 の静的メンバー関数には、静的関数を指す変数を宣言することによる回避策があります。
struct Foo
{
static void bar()
{ }
};
auto bar = Foo::bar;
編集:もちろん、静的メンバー関数を指すグローバル変数を持つことは、古い C++ 標準でも可能ですが、auto
C++11 のキーワードを使用するよりも面倒です。上記の例では、次のようになります。
void (*bar)() = Foo::bar;
あなたはできるtypedef
typedef A::B B;