2009-10-14 97 views
1

我有一個類的方法,像這樣的簽名:傳遞模板類作爲方法的參數

// someheader.h 
class Blah { 
... 
    void DoSomeWork(class Screen& p); 
.. 
}; 

Screen類然而,應該變成一個模板現在,像...

template <int width, int height> 
class Screen { 
... 

所以我的問題是,我應該如何改變someheader.h中的方法原型?

+3

您是否在DoSomeWorks簽名中指的是const而不是class? – GManNickG 2009-10-14 17:43:16

回答

10

Screen不是定義類型,只有Screen<int,int>
由於您期待模板化類型作爲參數,因此您需要將其作爲函數模板。有了這個,你可以命名參數類型:

class Blah 
{ 
public: 
    template<int width, int height> 
    void DoSomeWork(Screen<width,height>& p); 
}; 
+0

你是第一個:P我會添加一個像我一樣的tid位有一個爲什麼你需要模板。 – GManNickG 2009-10-14 17:47:22

+0

同意,添加... – 2009-10-14 17:56:40

1

有時候最簡單的就是定義模板函數來處理模板化類型的參數。當然,這意味着這些函數的實現需要移動到頭文件中,這有時會成爲一個問題。

一種替代方法是定義一個抽象基類並從中派生模板類,然後在函數簽名中使用指向抽象接口的指針或引用。

class IScreenBase 
{ 
    virtual void DoSomeWork() = 0; 
}; 


class Blah 
{ 
    DoSomeWork(IScreenBase& s) { s.DoSomeWork(); } 
}; 

template <typename T> 
class Screen : public IScreenBase 
{ 
    virtual void DoSomeWork() { ... } 
}; 

Screen<Foo> s; 

Blah blah; 
blah.DoSomeWork(s); 
5

由於DoSomeWork在Screen是一個模板之前就已經存在,它可能不需要知道Screen現在是一個模板。因此,您可以有一個ScreenBase類,它定義了DoSomeWork需要的API,並且屏幕繼承於此:

class ScreenBase { ... }; 

class Blah { 
    DoSomeWork(const ScreenBase& s) { ... } 
}; 

template <int width, int height> 
class Screen : public ScreenBase 
{ 
    ... 
}; 
相關問題