我有一个带有这样签名的类方法:
// someheader.h
class Blah {
...
void DoSomeWork(class Screen& p);
..
};
然而,Screen类应该现在变成一个模板,比如......
template <int width, int height>
class Screen {
...
所以我的问题是,如何在someheader.h中更改方法的原型?
答案 0 :(得分:10)
Screen
不是定义的类型,只有Screen<int,int>
由于您希望将模板化类型作为参数,因此需要将其设置为函数模板。有了它,您可以命名参数类型:
class Blah
{
public:
template<int width, int height>
void DoSomeWork(Screen<width,height>& p);
};
答案 1 :(得分:5)
由于DoSomeWork在Screen是模板之前就已经存在,它可能不需要知道Screen现在是模板。因此,您可以使用ScreenBase类来定义DoSomeWork所需的API,并且Screen继承自此:
class ScreenBase { ... };
class Blah {
DoSomeWork(const ScreenBase& s) { ... }
};
template <int width, int height>
class Screen : public ScreenBase
{
...
};
答案 2 :(得分: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);