Поделиться через


Ошибка компилятора C2558

"идентификатор": нет доступных конструкторов копии или конструктор копии объявлен как "explicit"

Замечания

Конструктор копий предназначен для инициализации объекта на базе другого объекта того же типа. (Это делает копию объекта.) Компилятор создает конструктор копирования по умолчанию, если вы не определяете конструкторы.

Устранение этой ошибки

  1. Проблема может возникнуть при попытке скопировать класс, конструктор копии которого объявлен как private. В большинстве случаев класс, конструктор копии которого объявлен как private, не подлежит копированию. Конструктор копий рекомендуется объявлять как private в тех случаях, когда необходимо запретить непосредственное использование класса. Такой класс может не использоваться полностью или использоваться только совместно с другим классом.

    Если вы полагаете, что использование класса с конструктором копии private безопасно, создайте класс, производный от класса с конструктором private, и определите доступный в новом классе конструктор копии public или protected. Вместо исходного класса используйте производный.

  2. Проблема может возникнуть при попытке скопировать класс, конструктор копии которого является явным. Если конструктор копии объявлен как explicit, передача объектов класса в функции и возврат из них не допускается. Дополнительные сведения о явных конструкторах см. в разделе "Преобразования определяемых пользователем типов".

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