テンプレート化されたクラスの特定の特殊化のみをフレンドシップするための構文はありますか、それともすべての特殊化を次のようなものとフレンドシップする必要がありますか?
template<class FooType> friend class Bar;
存在する場合、次のようなものを探します。
template<class FooType> friend class Bar<FooType const>;
スペシャライゼーションには、デフォルトでお互いの友達ではないため、独自の「友達になれる」アイデンティティがあるようです。たとえば、getFoo()
これはプライベートであるため、const 特殊化から派生した非 const ケースでは呼び出すことができません。
template<class FooType> class Bar;
template<class FooType>
class Bar<FooType const> {
public:
Bar (std::string name) : _foo (name) { }
FooType const * operator->() const
{ return &getFoo(); }
private:
FooType const & getFoo() const
{ return _foo; }
private:
FooType _foo;
};
template<class FooType>
class Bar : public Bar<FooType const> {
public:
Bar (std::string name) : Bar<FooType const> (name) { }
FooType * operator->()
{ return &getFoo(); }
private:
FooType & getFoo()
{ return const_cast<FooType &>(Bar<FooType const>::getFoo()); }
};
template<class FooType> friend Bar;
const 特殊化に追加する必要があります。
(余談ですが、友達のタグの説明はちょっとおかしいです。)