{νS}{μS}{希哲13年3月20日}{希哲13年3月20日のツイスト}{@}{ツイスト}{接頭子}{ae 客体}{スコープ解決演算子}{Emacs Lisp}=}(10)

{あれK#F85E/A-5B28-4B18}

この手の言語の問題として,スコープ解決演算子が無いので,グローバルに(Emacs Lisp の場合は無接頭子で)あれこれ追加するのは避けたい。局所変数などで簡単な名前を使うと,グローバルにある同名客体(オブジェクト)の参照手段が無くなる。μSνS ではこれを ae 客体とその略記法 @(シールド)で解決している。Emacs Lisp ではどうするべきかという問題があった。

=}
{名前盾}{νS}{Aejs}{半カプセル化}{希哲13年2月20日の開発}{@.}{シールド}{@}{}{スコープ解決演算子}=}(10)
{C++ における名前空間}{スコープ解決演算子}{名前空間}{前方宣言}{技術}{公開}{広告付き}{C++}=}(8)

{C++ 名前空間と前方宣言 K#F85E/A-9493}

C++(少なくとも C++03)では,名前空間に属するクラス等の前方宣言をする際に「::」は使えない。いちいち namespace ブロックで囲い,宣言してやる必要がある。

以下,名前空間 nsA に属するクラス classA を,nsA に属さない classB から参照したい場合の二例。

まずは失敗例。

# 不可。ここでコンパイル エラー。
class nsA::classA;

class classB
{
  # ここで参照したい。
  nsA::classA dataA;
}

次に成功例。

namespace nsA
{
    # 可。名前空間が入れ子になっている場合は,ブロックも入れ子で記述する。
    class classA;
}

class classB
{
  # ここで参照したい。
  nsA::classA dataA;
}

冗長かつ(コードとして)非直感的すぎるので,が知らない別のやり方があるのかもしれないとも思うのだが,C++ はこの手の問題が色々あるから,やっぱり単に仕様整備が追いつかなかっただけかな……。

=}