Вызовите оператор базового класса = из производного в пакете параметров - PullRequest
2 голосов
/ 23 июня 2019

Я реализовал простую программу на 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 & A :: operator = (const A &) 'примечание: см. ссылку на создание экземпляра шаблона функции' A & A :: operator = (const A &) 'компилируемое примечание: см. ссылку на экземпляр шаблона класса' A ', который компилируется

1 Ответ

2 голосов
/ 23 июня 2019

Вам необходимо расширить пакет параметров.Как насчет хорошего выражения сгиба:

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

Это расширит Ts... и эффективно создаст несколько вызовов на operator=, по одному для каждого типа в пакете.

...