considèrent l'algorithme suivant avec les tableaux:Fonction pour manipuler conteneur d'objets de base/dérivés
class MyType;
{
// some stuff
}
class MySubType:MyType
{
// some stuff
}
void foo(MyType** arr, int len)
{
for (int i = 0;i<len;i++)
// do something on arr[i]->
}
void bar()
{
MySubType* arr[10];
// initialize all MySubType*'s in arr
foo(&arr, 10);
}
Rien d'extraordinaire ici. Ma question est - comment puis-je faire cela avec des modèles?
void foo(std::vector<MyType>& s)
{
std::vector<MyType>::iterator i;
for (i = s.begin(); i != s.end(); i++)
// do stuff on *i
}
donc, dans le bar, je ne peux pas le faire:
void bar()
{
std::vector<MySubType> s;
foo(s); // compiler error
}
erreur: initialisation invalide de référence de type std::vector<MyType, std::allocator<MyType> >&
d'expression de type std::vector<MySubType, std::allocator<MySubType> >
Est-il possible de le faire quelque chose comme ça?
En fait, s'il y a une façon de le faire:
std::vector<MySubType> s;
std::vector<MyType>& t = s;
Je serais heureux ...
Soit cela ou des pointeurs je pense. –
J'aime ça, mais j'ai dû le changer un peu. Je mis typename devant T dans le modèle et j'ai aussi dû mettre typename avant std :: vector ... ne sais pas pourquoi ... pas très bon avec des modèles –
paquetp
La raison pour laquelle vous deviez mettre "template" est qu'il existe deux types de paramètres de gabarit: les types et les entiers, et vous devez dire quel genre est T. Vous avez dû mettre "typename std :: vector :: iterator i" parce que le compilateur ne peut pas dire que ".. . :: itérateur "est un type sans aide - sans" typename "il pense que" itérateur "est un membre de données du vecteur . –