クラス名の typedef がフレンド宣言のクラス名のように機能しない理由を知っている人はいますか?
class A
{
public:
};
class B : public A
{
public:
typedef A SUPERCLASS;
};
typedef A X;
class C
{
public:
friend class A; // OK
friend class X; // fails
friend class B::SUPERCLASS; // fails
};
ベストアンサー1
現時点ではできません。理由はまだわかりません (興味深いと思ったので調べているだけです)。更新: typedef 名をフレンドとしてサポートする最初の提案で理由を確認できます。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdfその理由は、標準では詳細な型指定子しかサポートされていなかったからです。それらだけを許可し、フレンドとして宣言されたエンティティがまだ宣言されていない場合は、周囲の名前空間のメンバーになると言うのは簡単です。しかし、これは、テンプレートパラメータを使用する場合、次のことを行う必要があることを意味します(たとえば、クラスが必要です)。
friend class T;
しかし、これによって新たな問題が発生し、得られるメリットに見合わないと判断されました。現在、この論文では、追加の型指定子を指定できるようにすることを提案しています (これにより、テンプレート パラメータと typedef 名の使用が可能になります)。
次の C++ バージョン (2010 年予定) ではそれが可能になります。
この標準の更新された提案を参照してください:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdftypedef 名だけでなく、テンプレート パラメータも friend として宣言された型として使用できるようになります。