This 質問は、クラス外のメンバー関数定義でクラス名(グローバルスコープ演算子を含む)を完全に修飾することがこれまでに有用/必要であるかどうか疑問に思いました。
一方では、これが以前に行われたのを見たことがありません(適切に行うための構文はあいまいに見えます)。もう1つは、C++での名前の検索は非常に簡単ではないため、コーナーケースが存在する可能性があります。
質問:
クラス外のメンバー関数定義を次の方法で導入するケースはありますかReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
とは異なりますReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(グローバルスコープなし::
接頭辞)?
メンバー関数の定義は、クラスを囲む名前空間に配置する必要があるため、 this は有効な例ではないことに注意してください。
sing-directiveは、修飾なしでFully
があいまいになる可能性があります。
namespace Foo {
struct X {
};
}
using namespace Foo;
struct X {
void c();
};
void X::c() { } // ambiguous
void ::X::c() { } // OK
マゾでこのようなものを書くのが好きなら必要です
namespace foo {
namespace foo {
struct bar {
void baz();
};
}
struct bar {
void baz();
};
void foo::bar::baz() {
}
void (::foo::bar::baz)() {
}
}
もちろん、2番目のオーバーロードをグローバルスコープでfoo::foo::bar::baz
として書き込むこともできますが、問題は、2つの宣言が異なる意味を持つことができるかどうかでした。そのようなコードを書くことはお勧めしません。
Usingディレクティブを使用すると、コードが混乱する可能性があります。
次の実証プログラムを検討してください
#include <iostream>
#include <string>
namespace N1
{
struct A
{
void f() const;
};
}
using namespace N1;
void A::f() const { std::cout << "N1::f()\n"; }
struct A
{
void f() const;
};
void ::A::f() const { std::cout << "::f()\n"; }
int main()
{
N1::A().f();
::A().f();
return 0;
}
読みやすくするために、この修飾名
void ::A::f() const { std::cout << "::f()\n"; }
関数が宣言されている場所を正確に示します。