2012-03-26 5 views
-2

Ich habe folgende Template-Methode in meiner Schnittstelle deklariert:Klasse Methodenvorlage Argumentliste

class IObjectFactory 
{ 
public: 
    virtual ~IObjectFactory() { } 

    virtual int32_t Init() = 0; 
    virtual bool Destroy() = 0; 
    virtual bool Start() = 0; 
    virtual bool Stop() = 0; 
    virtual bool isRunning() = 0; 
    virtual void Tick() = 0; 

    template <class T> 
    Object<T> CreateObject(T); 
}; 

Ich bin nicht sicher, wie der Anruf wie wenn aussieht. Ich dachte, das folgende wäre genug, wo mObjFactory eine Implementierung der zuvor erwähnten virtuellen Klasse ist;

inline void AllocateWithMemPoolAux() { mObjFactory->CreateObject<TestClass1>(); } 

Der Fehler, den ich bekommen ist „Nein Instanz von Funktionsvorlage entspricht der Argumentliste“ Wie sieht die richtige aussehen Funktionsaufruf?

(auch - als Nebenbei bemerkt, ist es in Ordnung, eine Template-Methode in einer Schnittstelle zu erklären und fordern die Benutzer es implementieren, wie Sie es nicht virtuell deklarieren?)

Dank

Antwort

1

Hinweis:

template <class T> 
Object<T> CreateObject(T); 

meinten Sie

template <class T> 
Object<T> CreateObject(); 

?

0

Sie erhalten diese Fehler , weil Sie kein Objekt TestClass1 an diese Methode übergeben.

richtig Code kompilieren würde wie folgt aussehen:

inline void AllocateWithMemPoolAux() 
{ 
    TestClass1 tObj; 
    mObjFactory->CreateObject<TestClass1>(tObj); 
} 

Ich nehme Ihre AllocateWithMemPoolAux() mehr Nebenwirkungen hat als hier gezeigt; Zumindest müssen Sie etwas mit dem Rückgabewert der CreateObject-Funktion tun (es könnte besser sein, ein Objekt als Referenz in diese Funktion zu übergeben).

0

eine Template-Funktion

template <class T> 
Object<T> CreateObject(T); 

nimmt ein Argument des Typs T. Du hast es ohne es genannt.

0

Sie nannten diese Methode ohne Argument:

mObjFactory->CreateObject<TestClass1>(); 

Sie müssen das Objekt vom Typ TestClass1 weitergeben müssen:

inline void AllocateWithMemPoolAux() { mObjFactory->CreateObject<TestClass1>(TestClass1()); } 
Verwandte Themen