2017-12-19 3 views
4

Ich habe eine Template-Klasse, die eine -template- Funktion hat, die einen Zeiger der gleichen Klasse als erstes Argument nimmt, zum Beispiel:Allgemein Template-Argument in Template-Funktion

template<class T> 
class Foo{ 
    void f(Foo* foo){} 
} 

Wenn ich es verwende in meinem Hauptfunktion scheint alles zu funktionieren, bis ich eine andere Vorlage für das Argument verwende.

int main(){ 
    Foo<double> f1; 
    Foo<double> f2; 
    f1.f(&f2); //No errors; 

    Foo<bool> f3; 
    f1.f(&f3);//Error : No matching function to call to Foo<double>::f(Foo<bool>*&) 
} 

Offenbar die einzige hier definierte Funktion ist Foo<T>::f(Foo<T>*)

Gibt es eine Möglichkeit, f definieren kann, die eine „generische“ Vorlage Foo Zeiger so nimmt ich es mit jeder anderen Art verwenden kann?

Antwort

11

Mit dem Symbol Foo innerhalb der Definition von Foo selbst entspricht Sprichwort Foo<T>. Wenn Sie eine andere Instantiierung Foo unterstützen wollen, machen f eine Template-Funktion:

template <class T> 
class Foo { 
    template <class U> 
    void f(Foo<U>* foo) { } 
}; 
+0

ok und wenn ich einen Zeiger auf ein anderes Objekt 'foo' in meiner Klasse haben wollen, die nicht vom Typ 'T' ist? – Elirovi

+0

@elirovi Verwenden Sie eine Basisklasse, void, any oder do not. Sie haben ein X/Y-Problem. – Yakk

+2

@Elirovi: Das ist eine separate Frage. Wird dieser Zeiger eine Membervariable sein? In diesem Fall muss Foo von FooBase abgeleitet werden, und der Zeiger ist auf FooBase. Ist es eine lokale Variable? In diesem Fall müssen Sie es zu einem Zeiger machen, egal auf welche Art von Foo Sie zeigen. –