2017-02-12 2 views
1

Ich versuche, eine Elementfunktion eines Objekts in einer Klassenvorlage aufzurufen, aber ich kann den folgenden Code nicht zum Kompilieren abrufen. Ich habe einen Post here gefunden, der besagt, dass ich object.template method<T>(); verwenden kann.Aufrufen von Vorlagenelementfunktionen

MSVC Mit 2015 erhalte ich Fehler C2059: Syntaxfehler: 'template'

#include <iostream> 

class Bar 
{ 
public: 
    Bar() : m_x(0.f) { } 
    ~Bar() { } 

    void setX(double x) { m_x = x; } 
    void printX(void) { std::cout << m_x << std::endl; } 

private: 
    double m_x; 
}; 

template <class T> 
class Foo 
{ 
public: 
    Foo() { } 
    ~Foo() { } 

    void setBar(T bar) { m_bar = bar; } 
    void printBar(void) { m_bar.template printX<T>(); } // This is the issue 

private: 
    T m_bar; 
}; 

int main() 
{ 
    Bar bar; 
    bar.setX(20.f); 
    bar.printX(); 

    Foo<Bar> foobar; 
    foobar.setBar(bar); 
    foobar.printBar(); 

    return 0; 
} 
+4

Wie geschrieben, scheint Bar keine Vorlagenfunktionen zu haben. –

+0

Der von Ihnen angegebene Link ist nur relevant, wenn die aufgerufene Memberfunktion eine Template-Member-Funktion ist, die Ihre * nicht * ist. Tatsächlich ist 'printX' weder eine Template-Member-Funktion noch ein Member einer Klassenvorlage (' Bar' ist keine Template-Klasse). Kurz gesagt, dieser Link ist nicht relevant für jedes Problem, das Sie tatsächlich haben. – WhozCraig

Antwort

1

Ihre Funktion printX kein Funktionselement Vorlage ist. Warum versuchst du es als Vorlage zu bezeichnen?

//       ,--- Not a template, so you must use 
//       v You must use the function like any other function 
void printBar(void) { m_bar.printX(); } 

Das Template-Schlüsselwort wird mit der Memberfunktionsvorlage eines abhängigen Typs verwendet. Wenn die Funktion printX eine Vorlage wäre und Sie das Template-Argument anstelle der Ableitung angeben möchten, dann würde die Syntax genau wie das Beispiel in der von Ihnen erwähnten Frage aussehen.

+0

Dumm ich, ich nahm von Anfang an an, dass der Versuch, eine Funktion von einer Vorlage aufzurufen, einen Fehler verursachen würde, weil es nicht weiß, dass "T" diese Methode hat. Danke für deine Hilfe, ich muss die Annahmen fallen lassen und einfach Dinge ausprobieren. – user2278611