一个相当模糊的任务出现了。有一个抽象模块“过滤器”:
template <typename T, typename DelayLineType>
class FilterAbstract
{
public:
explicit FilterAbstract(uint32_t length);
explicit FilterAbstract(const FilterAbstract &object);
FilterAbstract &operator=(const FilterAbstract &object);
virtual ~FilterAbstract() = default;
virtual T Step(const T &value) = 0;
DelayLineType DelayLine;
Vector<T> Coefficients;
};
接下来,我继承具有部分特化的抽象类:
template <typename T>
class FilterOnCircularVectors : public FilterAbstract<T, CircularVector<T>>
{
public:
explicit FilterOnCircularVectors(uint32_t length);
explicit FilterOnCircularVectors(const FilterAbstract<T, CircularVector<T>> &object);
T Step(const T &value) override;
};
现在,除了这样的继承之外,我想通过使用一个类来提供部分特Complex<T>
化,这里对如何在同一个文件中使用相同的名称正确实现它有一个误解:
template <template T>
class FilterOnCircularVectors : public FilterAbstract<T, CircularVector<Complex<T>>>
{
public:
explicit FilterOnCircularVectors(uint32_t length);
explicit FilterOnCircularVectors(const FilterAbstract<T, CircularVector<Complex<T>>> &object);
Complex<T> Step(const Complex<T> &value) override;
};
对此有什么想法吗?我真的不想生成标记为 Complex 的类。
UPD:
在 VS2019 中,如果创建两个具有这样的名称和这样的继承的类,则会由于多重定义而发生错误。事实是一个函数应该有不同的Step
行为CircularVector<T>
CircularVector<Complex<T>>
在这里,您需要将模板与专业化分开。即使特化是部分的,那么也必须定义这个特化,并且您正在尝试重新定义相同的模板。你需要
FilterOnCircularVectors< Complex<T> >
像这样定义它:在最后一个示例中,您更改了返回类型和接受的类型。在您实例化的基类中
你想要
为了使后者成为,您必须给模板的第一个参数不是 T,而是
Complex<T>
,那么一切都应该工作我提前警告您,在这种情况下,您将无法在提供不同类型时使用多态性。
如果您想要部分专业化,那么您需要这样做
正如@AR Hovsepyan 所指出的,任务已解决,但此外还必须遵循抽象函数的继承规则。然后解决方案将如下所示:
这是因为抽象函数是通过参数继承的,
T
为了解决我的问题,它需要Complex<T>