2016-05-13 85 views
0

我有這個C++模板父類的構造

template<class PayloadType> 
    class Event { 
    protected: 
     PayloadType payload; 
    public: 
     Event(PayloadType payload); 
    }; 

這是定義:

template<class PayloadType> 
Event<PayloadType>::Event(PayloadType payload) { 
    this->payload = payload; 
} 

而且這樣的:

class SimplePayload { 
protected: 
    int number; 
public: 
    SimplePayload(int number) : number(number) { } 
    int getNumber() { return number; }; 
}; 

template<class PayloadType> 
class SimpleEvent : public Event<PayloadType> { 
protected: 
    PayloadType payload; 
public: 
    SimpleEvent(PayloadType payload) : Event<PayloadType>(payload) { } 
}; 

嘗試使用它:

SimplePayload simplePayload; 
SimpleEvent<SimplePayload> *simpleEvent = dynamic_cast<SimpleEvent<SimplePayload>*>(new Event<SimplePayload>(simplePayload)); 

而且我得到這個錯誤:

error: member initializer 'Event' does not name a non-static data member or base class 

我怎樣才能正確地構造對象?

+0

對不起,修正了它。這就是我的實際情況。 –

+6

你的演員沒有任何意義。你分配一個'Event'對象實例,不管你說什麼都不會是一個SimpleEvent。 –

+1

'dynamic_cast'用於改變現有變量的類型。在變量創建中使用它是毫無意義的。它也會失敗,因爲參數('new Event ...')不是您要投射到的類型('SimpleEvent ...'),它是基本類型。如果你需要一個派生類型,可以使用'= new SimpleEvent <...>(...)',如果你需要多態性,或者使用普通的非指針'SimpleEvent',如果不需要,可以使用'std :: unique_ptr'。 – chris

回答

2

你需要指定模板參數:

template<class PayloadType> 
class SimpleEvent : public Event<PayloadType> { 
protected: 
    PayloadType payload; 
public: 
    SimpleEvent(PayloadType payload) : Event<PayloadType>(payload) { } 
              ~~~~~~~~~~~~~ 
}; 

編輯

對於鏈接錯誤,請嘗試將定義移到頭文件。

Why can templates only be implemented in the header file?

+0

SimpleEvent(PayloadType有效內容):事件(有效內容){}和SimpleEvent * simpleEvent = new SimpleEvent (simplePayload);但我最終得到了未定義的x86_64體系結構: 「Event :: Event(SimplePayload)」,引用自: main.cpp.o中的SimpleEvent :: SimpleEvent(SimplePayload) –

+4

@DanielRibeiro you尚未定義Event <>的構造函數。 –

+0

我做過,但是像這樣:Event(PayloadType payload); –

0

我看到幾個錯誤。

錯誤1

template<class PayloadType> 
Event<PayloadType>::Event(PayloadType payload) { 

    // this->payload is of type PayloadType* 
    // payload is of type PayloadType 
    // Assigning to a pointer using an object is a problem. 
    this->payload = payload; 
} 

最簡單的分辨率將是使this->payloadPayloadType類型的對象。

使用從派生類的基類的構造函數時,您不使用模板參數錯誤。

SimpleEvent(PayloadType payload) : Event(payload) { } 

需求是:

SimpleEvent(PayloadType payload) : Event<PayloadType>(payload) { } 

更新,因爲這個答案

的OP的問題已被更新。所以,第一個錯誤不再是錯誤。