Я получаю сообщение об ошибке при вызове конструктора базовой копии - PullRequest
1 голос
/ 17 января 2012

Я получаю error C2082: redefinition of formal parameter 'rval' в этом коде при попытке явно вызвать базовую копию ctor:

 #include <iostream>
 using namespace std;


class Base
{
public:
    Base(const Base& rhs){ cout << "base copy ctor" << endl; }
};

class Derived : public Base
{
public:
    Derived(const Derived& rval) { Base(rval) ; cout << "derived copy ctor" << endl; }
      // error C2082: redefinition of formal parameter 'rval'
};

int main()
{
    Derived a;
    Derived y = a; // invoke copy ctor
    cin.ignore();
    return 0;
}

Однако, если сделать это так:

Derived(const Derived& rval) { Base::Base(rval) ; cout << "derived copy ctor" << endl; }

тогда все в порядке.

Почему я спрашиваю это? согласно ответам на StackOwerflow

Мне не нужно использовать оператор :: для доступа к базовой копии ctor, так почему я получаю эту ошибку?

Кстати: я использую Visual Studio 2010.

У меня есть еще один вопрос:

Нужно ли вызывать конструктор перемещения base в определяемом пользователем конструкторе перемещения производного класса?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Для вызова базового конструктора необходимо поместить вызов в список инициализации члена

class Derived : public Base
{
public:
    Derived(const Derived& rval) : Base(rval)
    { 
         cout << "derived copy ctor" << endl;
    }
};
1 голос
/ 17 января 2012

Предполагая, что вы имеете в виду конструктор перемещения, это конструктор копирования - Да. Вам придется вызвать конструктор базы. В противном случае определение базового объекта в производном объекте будет неполным. Вы можете вызвать конструктор копирования или обычный конструктор базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...