Почему я не могу переопределить конструктор копирования по умолчанию и оператор присваивания версиями шаблона в C ++ - PullRequest
5 голосов
/ 28 февраля 2012

Я задал этот вопрос о перегрузке конструктора копирования и оператора присваивания версиями шаблона и рассмотрении путаницы, связанной с вопросом (поскольку это, похоже, ошибка компилятора), я решил попробоватьтолько конструктор копирования шаблона и оператор присваивания шаблона, чтобы увидеть, что происходит.Но они полностью игнорируются компилятором.

struct BaseClass
{
public:
  BaseClass() {}

  template<typename T>
  BaseClass(const T& a_other)
  {
    int i = 0; // for break point which is not hit
  }

  template<typename T>
  BaseClass& operator= (const T& a_other)
  {
    int i = 0; // for break point which is not hit
    return *this;
  }

};

struct MyClass : public BaseClass
{
};

int main()
{
  MyClass i, j;
  i = j;

  return 0;
}

Почему я не могу переопределить значения по умолчанию с версиями шаблонов (я подозреваю, что ответ будет значения по умолчанию лучше соответствуют , но я бы хотел, чтобы версии шаблонов действовалитак же по умолчанию)?И что я могу сделать, чтобы убедиться, что версии шаблонов вызываются вместо значений по умолчанию?

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012
template<typename T>
BaseClass(const T& a_other) 

Прежде всего, это не конструктор копирования. Это скорее шаблонный конструктор.

Конструктор копирования должен быть таким:

BaseClass(const BaseClass & a_other)

Заметили разницу?

Обратите внимание, что шаблонный конструктор не определяет copy-constructor . Компилятор все равно сгенерирует для вас конструктор копирования по умолчанию вместо создания экземпляра шаблонного конструктора.

Тот же аргумент для копирования-присваивания.

4 голосов
/ 28 февраля 2012

Как уже упоминалось в ответах на ваш другой вопрос, стандарт специально запрещает его.

Я бы предположил, что логическое обоснование состоит в том, что если для этих конструкторов необходим нестандартный параметр, то это будет потому, что им нужноиметь дело со спецификой рассматриваемого класса.«Общее» решение не имеет смысла и может незаметно скрывать потенциальные проблемы.

Некоторые люди могут подумать, что это достаточно плохо, что уже есть «общие» неявные версии этих функций, которые молча делают неправильную вещь длямного классов.

Стандартное запрещающее шаблон версино из них приведено здесь:

Из C ++ 03 12.8 "Копирование объектов класса"

  • (пункт 1): не шаблонный конструктор для класса X является конструктором копирования, если его первый параметр имеет тип X &, const X &, volatile X & или const volatile X &, и либо нет других параметров, либо все остальные параметры имеютаргументы по умолчанию (8.3.6)
  • (параграф 9): пользовательский оператор назначения копирования X :: operator = является нестатическим не шаблонным функцией-членом класса X сровно один параметр типа X, X &, const X &, volatile X & или const volatile X &
...