質問: ### 質問内容 ユーザ定義の名前空間に属するクラスを、別のクラスのメンバ変数とする場合に、なぜ下記のように記述する必要があるのでしょうか。 ------------------------------------------------------------- ※piyoクラスがhoge名前空間に属しているとします。 namespace hoge { class Piyo; } class MyClass { hoge::Piyo* p; } 上記ではなく、単純に前方宣言でclass hoge::piyoでは、なぜダメなのでしょうか。 ご教授願います。 ### 補足情報(FW/ツールのバージョンなど) Visual Studio 2017
回答: こんにちは。 同じQAが 本家の方のstackoverflowにありました。 標準規格上は、classの後に書くものは「識別子」ですが、hoge::Piyoは識別子ではなく修飾名だからっぽいです。 また、class hoge::Piyo;と書いた時、hogeがclass, struct, union, namespaceのどれか分からないです。それを適切に判定できるルールが複雑怪奇になる割にメリットがないので切り捨てたのではないかと思います。 最後に、識別子を宣言する時に修飾できないという制約はコンパイラ開発者には凄くありがたい制約のように思えます。テンプレートや部分特殊化などなどで修飾名を許したらただでさえ憂鬱そうなのに、ますます憂鬱になりそうです。