2016-12-06 28 views
0

這是我第一次在課堂上使用模板。這是我的嘗試。這種使用模板有什麼問題?

MyCairoControl.h:

#ifndef _MYCAIROCONTROL_ 
#define _MYCAIROCONTROL_ 

template<class T> 
class MyCairoControl : public IControl 
{ 
private: 
    T *pPlug; 

public: 
    MyCairoControl(T *plug, IRECT container); 
    ~MyCairoControl(); 
}; 

#endif // !_MYCAIROCONTROL_ 

MyCairoControl.cpp:

#include "MyCairoControl.h" 

MyCairoControl::MyCairoControl(T *plug, IRECT container) : IControl(plug, container), pPlug(plug) { 
     // t->somethings(); 
} 
MyCairoControl::~MyCairoControl() { 

} 

但它說, 「T」 是不確定的,所以我不能使用CTOR。在課堂上使用模板不正確嗎?

+0

有些東西告訴我你會在稍後閱讀:[「爲什麼模板只能在頭文件中實現?」](https://stackoverflow.com/questions/495021/why-can- template-only-be-implemented-in-the-header-file) – WhozCraig

+0

@paizza我已經更新了我的答案,對使用.cpp文件和模板進行簡短討論。它現在也可以工作。 – Xharlie

回答

1

你需要重新聲明T作爲實現文件的模板類型名稱:

#include "MyCairoControl.h" 

template<class T> 
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container) : IControl(plug, container), pPlug(plug) { 
     // t->somethings(); 
} 


template<class T> 
MyCairoControl<T>::~MyCairoControl() { 

} 

原來的問題是雙重的。首先,T作爲一個符號需要被稱爲模板參數。添加到執行簽名的template<class T>行會這樣做 - 它定義了什麼T的含義。其次,你需要認識到構造函數和析構函數以及實際上任何成員所屬的類型不再是MyCairoControl而是MyCairoControl<T>。範圍解析運算符的左側現在需要做到這一點。

還有一個值得注意的問題。就目前而言,類成員的實現與標題位於不同的文件中,這可能會帶來問題。該類的消費者將包含標題而不是源文件,因此他們將無法使用該模板 - 例如,如果他們嘗試使用MyCairoControl<Foo>,他們將得到未解決的符號錯誤。如果您知道將用於T的類型,則可以修復此問題。具體而言,如果你在​​聲明專業化如下:

template <> 
class MyCairoControl<Foo>; 

template <> 
class MyCairoControl<Bar>; 

任何人都可以使用MyCairoControl<Foo>MyCairoControl<Bar>而是試圖用MyCairoControl<OtherType>還是會給予解析外部符號錯誤,直到你添加一個向前聲明這一點。

+0

當然我已經嘗試過了,但是它說'類模板的參數列表「MyCairoControl」在析構函數週圍缺少... – markzzz

+0

對不起 - 我錯過了一些位 - 它是固定的。(具體來說:參數是爲類而且必須在類名上,而不僅僅是函數。我誤解了這個問題。) – Xharlie

3

由於MyCairoControl類模板,其方法定義必須是模板爲好,匹配類的模板參數:

template <class T> 
MyCairoControl<T>::MyCairoControl(T *plug, IRECT container){ 
    /* ... */ 
} 

template <class T> 
MyCairoControl<T>::~MyCairoControl() { 
    /* ... */ 
} 

wandbox example


這也意味着,定義在編譯期間總是必須可用,而不是鏈接 - 它們需要存在於頭文件中。

This article(「如何在.h文件中定義模板類並在.cpp文件中實現它」)對此問題給出了全面的說明。

+0

我認爲OP的更大問題是模板定義在一個單獨的源代碼中永無止境文件。 – DeiDei

+0

@DeiDei:從字面上編輯它現在:) –

+0

因此,對於每種方法,我需要添加此?這是懶惰的... – markzzz