テンプレートを使った私の冒険では、Containerクラスに保持されているItemTypeだけでなく、アイテムをどのように並べるべきかを決定するFunctorの引数にテンプレートを貼り付けました。ここまでは順調ですね。同じクラステンプレートの異なるインスタンス化のプライベート部分にアクセスする方法はありますか?
1つのコンテナの内容を別のコンテナにコピーしたいときに発生した小さな問題:2つのコンテナに異なるFunctorタイプがある場合、技術的には関連のないクラスです。したがって、コンテナAはコンテナBの非公開のコンテンツにアクセスすることはできません。私がアクセスする必要があるすべてのものを作る以外に、この問題に対処する良い方法はありますか?おそらく、 "友人"宣言をテンプレートするための何らかの方法はありますか?問題を実証する
例のコードは、次のとおりです。
#include <stdio.h>
class FunctorA {};
class FunctorB {};
template <class ItemType, class Functor> class MyContainer
{
public:
MyContainer() : _metaData(0) {/* empty */}
template<class RHSFunctor> void CopyFrom(const MyContainer<ItemType, RHSFunctor> & copyFrom)
{
_metaData = copyFrom._metaData;
_item = copyFrom._item;
}
private:
int _metaData;
ItemType _item;
};
int main(int argc, char ** argv)
{
MyContainer<void *, FunctorA> containerA;
MyContainer<void *, FunctorB> containerB;
containerA.CopyFrom(containerB); // error, containerA::CopyFrom() can't access containerB's private data!
return 0;
}
は、クラスをインスタンス化することができないことを反映するためにタイトルを明確化していますが、クラステンプレートをインスタンス化することができます。混乱の一部は、クラステンプレートが型自体ではなく、各インスタンス化が別の型であるという事実に従います。 – MSalters