我有一個類的方法,像這樣的簽名:傳遞模板類作爲方法的參數
// someheader.h
class Blah {
...
void DoSomeWork(class Screen& p);
..
};
Screen類然而,應該變成一個模板現在,像...
template <int width, int height>
class Screen {
...
所以我的問題是,我應該如何改變someheader.h中的方法原型?
我有一個類的方法,像這樣的簽名:傳遞模板類作爲方法的參數
// someheader.h
class Blah {
...
void DoSomeWork(class Screen& p);
..
};
Screen類然而,應該變成一個模板現在,像...
template <int width, int height>
class Screen {
...
所以我的問題是,我應該如何改變someheader.h中的方法原型?
Screen
不是定義類型,只有Screen<int,int>
。
由於您期待模板化類型作爲參數,因此您需要將其作爲函數模板。有了這個,你可以命名參數類型:
class Blah
{
public:
template<int width, int height>
void DoSomeWork(Screen<width,height>& p);
};
你是第一個:P我會添加一個像我一樣的tid位有一個爲什麼你需要模板。 – GManNickG 2009-10-14 17:47:22
同意,添加... – 2009-10-14 17:56:40
有時候最簡單的就是定義模板函數來處理模板化類型的參數。當然,這意味着這些函數的實現需要移動到頭文件中,這有時會成爲一個問題。
一種替代方法是定義一個抽象基類並從中派生模板類,然後在函數簽名中使用指向抽象接口的指針或引用。
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);
由於DoSomeWork在Screen是一個模板之前就已經存在,它可能不需要知道Screen現在是一個模板。因此,您可以有一個ScreenBase類,它定義了DoSomeWork需要的API,並且屏幕繼承於此:
class ScreenBase { ... };
class Blah {
DoSomeWork(const ScreenBase& s) { ... }
};
template <int width, int height>
class Screen : public ScreenBase
{
...
};
您是否在DoSomeWorks簽名中指的是const而不是class? – GManNickG 2009-10-14 17:43:16