[英]Template class on a abstract class
所以我有一个类模板Foo
:
template <typename T>
class Foo
{
public:
Foo();
~Foo();
//...
};
我有两个从Foo类派生的类:
class FooDerived1 : public Foo<int>
{
public:
FooDerived1 ();
~FooDerived1 ();
};
class FooDerived2 : public Foo<double>
{
public:
FooDerived2 ();
~FooDerived2 ();
};
但是现在我看到类模板正在这样的抽象类IBar
上使用:
class Foo;
class IBar
{
public:
virtual void placeFoo(Foo& foo) = 0; //error
virtual void removeFoo(Foo& foo) = 0;
};
我知道我不能在抽象虚拟类中使用模板类。
但是..在这种情况下,我该怎么办?
我真的需要像这样的IBar抽象类...
忘记模板类的用法了吗?
选项1:将IBar
本身作为模板类。
template <class T>
class Foo;
template <class T>
class IBar
{
public:
virtual void placeFoo(Foo<T>& foo) = 0;
virtual void removeFoo(Foo<T>& foo) = 0;
};
选项2:使所有Foo<T>
都从公共的非泛型FooBase
。
class FooBase
{
// ...
};
template <typename T>
class Foo : public FooBase
{
public:
Foo();
~Foo();
//...
};
// ...
class FooBase;
class IBar
{
public:
virtual void placeFoo(FooBase& foo) = 0;
virtual void removeFoo(FooBase& foo) = 0;
};
两种解决方案的可行性取决于您实际上对T
类型的依赖程度。 但这是将虚拟功能与模板混合使用时的期望。 使用选项1,您将不再具有通用接口类型。 使用选项2, FooBase
无法为任何成员函数提供T
依赖的参数。
顺便说一句,不要忘记您的真实代码中的虚拟析构函数。
如果需要共同的行为,请为Foo<>
所有实例创建基类:
class FooBase
{
//common interface and data
};
template <class T>
class Foo : public FooBase
{
};
接着:
class FooBase;
class IBar
{
public:
virtual void placeFoo(FooBase& foo) = 0; //ok
virtual void removeFoo(FooBase& foo) = 0;
};
事实是,您尝试将模板(编译时)和动态多态性(运行时)混合在一起,这可能会引起问题(这是您所说的“我知道我无法在抽象虚拟类中使用模板类”的意思吗?)。
为什么不坚持使用模板呢?
class IBar
{
public:
template <class T>
void placeFoo(Foo<T>& foo);
template <class T>
void removeFoo(Foo<T>& foo);
};
要么:
template <class T>
class IBar
{
public:
void placeFoo(Foo<T>& foo);
void removeFoo(Foo<T>& foo);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.