Dans mon aventure continue avec des modèles, j'ai modélisé ma classe Container non seulement sur le ItemType qu'elle contient, mais aussi sur un argument Functor qui détermine comment elle doit ordonner les éléments. Jusqu'ici tout va bien.Existe-t-il un moyen d'accéder aux parties privées d'une instanciation différente du même modèle de classe?
Un petit problème que j'ai rencontré se produit lorsque je veux copier le contenu d'un conteneur à un autre: Si les deux conteneurs ont des types de foncteurs différents, alors techniquement ils sont des classes non liées. Par conséquent, le conteneur A n'est pas autorisé à accéder au contenu non public du conteneur B. Existe-t-il un bon moyen de résoudre ce problème, autre que de rendre tout ce dont j'ai besoin pour accéder au public? Un moyen de modéliser une déclaration "d'ami", peut-être?
code exemple pour démontrer le problème suit:
#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;
}
Clarifiée le titre pour indiquer que vous ne pouvez pas instancier une classe, mais vous pouvez instancier un modèle de classe. Une partie de la confusion découle du fait que les modèles de classe ne sont pas des types eux-mêmes, mais chaque instanciation est un type distinct. – MSalters