betrachten den folgenden Algorithmus mit Arrays:Funktion zur Manipulation Behälter von Basis-/Abgeleitete Objekte
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);
}
Nichts Besonderes hier. Meine Frage ist - wie mache ich das mit Vorlagen?
void foo(std::vector<MyType>& s)
{
std::vector<MyType>::iterator i;
for (i = s.begin(); i != s.end(); i++)
// do stuff on *i
}
so, in bar, ich kann das nicht tun:
void bar()
{
std::vector<MySubType> s;
foo(s); // compiler error
}
Fehler: ungültige Initialisierung einer Referenz des Typs std::vector<MyType, std::allocator<MyType> >&
von Expression von Typ std::vector<MySubType, std::allocator<MySubType> >
Gibt es irgendeine Art und Weise zu tun etwas wie das?
Grundsätzlich, wenn es eine Möglichkeit, dies zu tun:
std::vector<MySubType> s;
std::vector<MyType>& t = s;
Ich würde mich freuen ...
Entweder das oder Zeiger würde ich denken. –
Ich mag das, aber musste es ein bisschen ändern. Ich legte Typname vor T in Vorlage und ich musste auch Typname vor Std :: Vector setzen ... weiß nicht warum ... nicht sehr gut mit Vorlagen –
paquetp
Der Grund, warum Sie "Vorlage" setzen mussten ist Es gibt zwei Arten von Template-Parametern: Typen und Integer, und Sie müssen sagen, welche Art T ist. Sie mussten "Typname std :: vector :: iterator i" setzen, weil der Compiler das nicht sagen kann. . :: iterator "ist ein Typ ohne Hilfe - ohne" typename "denkt er, dass" iterator "ein Datenelement des Vektors ist. –