当前位置: 首页 > 知识库问答 >
问题:

调用基类运算符=from派生参数包

师冥夜
2023-03-14

我在C 17中实现了一个简单的程序,在该程序中,我尝试使用参数扩展从派生类调用基类operator=。但程序无法编译。

#include "pch.h"
#include <iostream>

class D
{
    public:
        D()
        {
            std::cout << "D ctror" << std::endl;
        }
        D  &  operator = (const D & other)
        {
            return *this;
        }
};
class C
{
    public:
        C()
        {
            std::cout << "C ctror" << std::endl;
        }
        C  &  operator = (const C & other)
        {
            return *this;
        }
};
class B
{
    public:
        B()
        {
        std::cout << "B ctror" << std::endl;
        }


        B  &  operator = (const B & other)
        {
            std::cout << "operator B" << std::endl;
            return *this;
        }
};


template<typename... Ts> class A: public Ts...
{ 
public:

    A():  Ts()...
    {
    }
    A  &  operator = (const A & other)
    {
        Ts::operator =(other);
        return *this;
    }

};

int main()
{

    A<B,C,D> a1;
    A<B,C,D> a2;
    a1 = a2;
}

使用的工具集是Visual Studio 2017 (v141)

生成的错误如下

错误C3520:“=”:必须在此上下文中展开参数包注意:编译类模板成员函数“A”时

共有1个答案

芮建茗
2023-03-14

您需要展开参数包。一个漂亮的折叠表达怎么样:

(Ts::operator=(other), ...);

这将扩展Ts…并有效地创建对操作员=的多次调用,包中的每种类型一个。

 类似资料:
  • 我仍然试图掌握抽象基类的概念,以及从派生类中可以做什么和不能做什么。 我有以下代码: 基类中的示例- 在派生类中

  • 问题内容: 因此,此代码的输出为。现在,我想到了一个问题:作为 派生 类对象的 po 怎么能调用作为基类的 PrivateOverride 的私有方法? 问题答案: 因为您在类中定义了main方法。如果将main方法放在Derived类中,它将无法编译,因为在该类中不可见。 class中的po.f()调用不是多态的,因为in 类为,所以in class中的值不会被覆盖。

  • 在下面的代码中,我为数组下标运算符提供了默认参数。 但是,编译器生成了一个错误: 但是,如果我为函数调用操作符提供默认参数。 很好用。 所以,我有一个问题: 为什么不允许数组下标运算符的默认参数

  • 问题内容: 如何使用C ++从派生类调用父函数?例如,我有一个名为的类,一个名为的类是从父类派生的。每个类中都有一个print函数。在定义孩子的打印功能时,我想调用父母的打印功能。我将如何去做呢? 问题答案: 我冒着明显的危险:调用该函数,如果它在基类中定义,则该函数在派生类中自动可用(除非它是private)。 如果派生类中有一个具有相同签名的函数,则可以通过在基类名称后加上两个冒号来消除歧义。

  • 一、数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。 数据类型 描述 Byte 8 位有符号补码整数。数值区间为 -128 到 127 Short 16 位有符号补码整数。数值

  • 我无法将派生类传递给接受基类作为参数的函数。基类由“障碍物”组成,这些障碍物将被放置在“板”上。无效的board::setvalue(int-length、int-width、board 但是,这会导致编译器给出“未知参数转换…”错误。在浏览站点时,我发现我应该将派生对象作为常量进行传递,但这会导致问题,因为无法将常量分配给线路板(因为它包含指向非常量障碍物的指针)。 反过来,将线路板更改为包含常

  • 我有一个模板类包含其他类的优先级队列,我需要使用优先级重载器调用各个类重载器,根据各个类的偏好进行比较(在这种情况下是年龄,在另一个类中可能是价格。 我绝对相信我已经实现了不正确的运算符重载,因此非常感谢您的建议。 举个例子 我得到这个错误,我不知道我需要做什么来修复它。我必须将类重载保持为单个变量(Animal) 任务cpp:在“布尔运算符”的实例化中

  • 整型 1,浮点型 1.2,字符 'a',字符串 "abc",布尔型 true 和 单元类型 () 可以 用数字、文字或符号的字面意义表示出来。 数字可以加上前缀 0x、0o、0b 分别表示十六进制数、八进制数、二进制数。 为了改善数字的可读性,可以在数字类型之间加上下划线(_),比如: 1_000 等同于 1000, 0.000_001 等同于 0.000001。 我们需要告诉计算机使用到的数据类