RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1154155
Accepted
OnuchinVA
OnuchinVA
Asked:2020-07-18 01:50:00 +0000 UTC2020-07-18 01:50:00 +0000 UTC 2020-07-18 01:50:00 +0000 UTC

C++ 类模板的部分特化

  • 772

一个相当模糊的任务出现了。有一个抽象模块“过滤器”:

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>>

c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. AR Hovsepyan
    2020-07-18T04:07:34Z2020-07-18T04:07:34Z

    在这里,您需要将模板与专业化分开。即使特化是部分的,那么也必须定义这个特化,并且您正在尝试重新定义相同的模板。你需要FilterOnCircularVectors< Complex<T> >像这样定义它:

    template <typename T>
    class FilterOnCircularVectors<Complex<T>> 
          : public FilterAbstract<T, CircularVector<Complex<T>>>
    {
    public:
        /*Если классу нужны свои конструкторы, то нужно
        в списке инициализации конструктора инициализировать
        и базовый объект(он кажется даже не конструируется по 
         умолчанию)*/
    
        Complex<T> Step(const Complex<T>& value) override;
    
    };
    
    • 1
  2. Кирилл Чуркин
    2020-07-18T03:34:32Z2020-07-18T03:34:32Z

    在最后一个示例中,您更改了返回类型和接受的类型。在您实例化的基类中

    virtual T Step(const T &value) = 0;
    

    你想要

    virtual Complex<T> Step(const Complex<T> &value) = 0;
    

    为了使后者成为,您必须给模板的第一个参数不是 T,而是Complex<T>,那么一切都应该工作

    template <typename T>
    class FilterOnCircularVectors : public FilterAbstract<Complex<T>, CircularVector<Complex<T>>>
    {
    public:
        explicit FilterOnCircularVectors(uint32_t length);
        explicit FilterOnCircularVectors(const FilterAbstract<Complex<T>, CircularVector<Complex<T>>> &object);
    
        Complex<T> Step(const Complex<T> &value) override;
    
    };
    

    我提前警告您,在这种情况下,您将无法在提供不同类型时使用多态性。

    如果您想要部分专业化,那么您需要这样做

    template <typename T, typename DelayLineType>
    class FilterAbstract<Complex<T>, DelayLineType>
    {
    public:
        explicit FilterAbstract(uint32_t length);
        explicit FilterAbstract(const FilterAbstract &object);
        FilterAbstract &operator=(const FilterAbstract &object);
        virtual ~FilterAbstract() = default;
    
        virtual Complex<T> Step(const Complex<T> &value) = 0;
    
        DelayLineType DelayLine;
        Vector<T> Coefficients;
    };
    
    • 0
  3. Best Answer
    OnuchinVA
    2020-07-19T04:10:34Z2020-07-19T04:10:34Z

    正如@AR Hovsepyan 所指出的,任务已解决,但此外还必须遵循抽象函数的继承规则。然后解决方案将如下所示:

    template <typename T>
    class FilterOnCircularVectors<Complex<T>>
        : public FilterAbstract<T, CircularVector<Complex<T>>>
    {
    public:
        /*Если классу нужны свои конструкторы, то нужно
        в списке инициализации конструктора инициализировать
        и базовый объект(он кажется даже не конструируется по
         умолчанию)*/
    
        explicit FilterOnCircularVectors<Complex<T>>(uint32_t length);
        explicit FilterOnCircularVectors<Complex<T>>(const FilterAbstract<T, CircularVector<Complex<T>>> &object);
        Complex<T> Step(const Complex<T> &value);
    private:
        T Step(const T &value) override;
    };
    

    这是因为抽象函数是通过参数继承的,T为了解决我的问题,它需要Complex<T>

    • 0

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5