2016-11-11 3 views
0

Ich möchte eine generische Klasse erstellen, die eine Methode enthält, die eine Nachricht anzeigt, wenn der Typ der Klasse int ist und die andere, wenn sie doppelt ist. Hier ist mein Code:Spezialisierung von Elementfunktionsvorlagen in C++

template<class T> 
class A { 
public: 
    template <T> void B(); 

}; 

template<class T> 
void A<int>::B{ 
//some code here 
} 

template<class T> 
void A<double>::B{ 
//some code here 
} 

Ich habe die folgenden Fehler:

'double': illegal type for non-type template parameter '__formal' 

'A<int>::B': unable to match function definition to an existing declaration 

Vielen Dank im Voraus für alle Lösungen.

+0

Ihr Code nicht Ihre Fehler überein. Bitte geben Sie eine [mcve] – NathanOliver

+2

an. Sie sollten nicht denselben Template-Parameternamen für die Funktionsvorlage als Klassenvorlage verwenden. – NathanOliver

+2

Sind Sie sicher, dass "B" auch eine Vorlage sein soll? Aus Ihrer Beschreibung scheint es, als ob Sie möchten, dass "B" eine normale Nicht-Template-Member-Funktion der Klassenvorlage "A" ist. – Angew

Antwort

2

Ein paar Dinge:

  • Es gibt keinen Grund für B eine Vorlage zu sein. Sie möchten sich spezialisieren für A
  • B ist eine Methode. Methoden akzeptieren Parameter. Wenn das Verfahren definiert, weggelassen Sie die Klammer ()
  • Template Spezialisierung immer Parameter <>

Code eine leere Vorlage beinhaltet:

template<class T> 
class A { 
public: 
    void B(); 
}; 

template<> 
void A<int>::B(){ 
    std::cout << "A<int>::B" << std::endl; 
} 

template<> 
void A<double>::B(){ 
    std::cout << "A<double>::B" << std::endl; 
} 

Demo

Wenn Sie gezwungen fühlen B eine machen Vorlage, sollte ich beachten, dass man im Allgemeinen keine Template-Spezialisierung auf Funktionen durchführt. Dies liegt hauptsächlich daran, dass sie nicht teilweise spezialisiert sein können, und es ist fast immer besser, eine Überladung zu schreiben. In Ihrem Fall, B keine Argumente, so gibt es einige Argumente für die Spezialisierung.

In den meisten Fällen würde man stattdessen einen Tag-Dispatching-Ansatz verwenden, der mit einer Hilfsfunktion gekoppelt ist, so dass sie ihre gewünschte Funktion wählen können, indem sie den Vorteil des Überladens nutzen. Hier ist ein einfaches Beispiel für Tag für Ihren Fall Dispatching:

template<class T> 
class A { 
public: 
    template<class U> 
    void B() 
    { 
     B(ATag<U>{}); 
    } 

    private: 
    template<class U> 
    struct ATag{}; 

    void B(ATag<int>) 
    { 
     std::cout << "B<int>" << std::endl; 
    } 

    void B(ATag<double>) 
    { 
     std::cout << "B<double>" << std::endl; 
    } 
}; 

tag dispatch demo

+0

Vielen Dank! Ich habe die Klammer in meinem Programm, vergaß nur, sie hier aufzunehmen. Alles funktioniert jetzt –

Verwandte Themen