Udostępnij za pomocą


Błąd kompilatora C2558

'identifier' : nie ma dostępnego konstruktora kopiującego lub konstruktor kopiujący jest zadeklarowany jako 'explicit'

Uwagi

Konstruktor kopiujący inicjuje obiekt z innego obiektu tego samego typu. (Tworzy kopię obiektu). Kompilator generuje domyślny konstruktor kopiowania, jeśli nie zdefiniujesz żadnych konstruktorów.

Aby naprawić ten błąd

  1. Problem może wystąpić, gdy zostanie podjęta próba skopiowania klasy, której konstruktorem kopii jest private. W większości przypadków nie należy kopiować klasy, która ma private konstruktor kopiujący. Typowa technika programowania deklaruje private konstruktor kopiujący, aby zapobiec bezpośredniemu użyciu klasy. Klasa może być bezużyteczna samodzielnie lub wymagać innej klasy, aby działać poprawnie.

    Jeśli ustalisz, że można bezpiecznie użyć klasy, która ma konstruktor kopiujący private , należy utworzyć nową klasę z klasy, która ma private konstruktor i udostępnić public konstruktor lub protected kopię w nowej klasie. Użyj klasy pochodnej zamiast oryginalnej.

  2. Problem może wystąpić, gdy zostanie podjęta próba skopiowania klasy, której konstruktor kopiowania jest jawny. Deklarowanie konstruktora kopiowania, ponieważ explicit uniemożliwia przekazywanie/zwracanie obiektów klasy do/z funkcji. Aby uzyskać więcej informacji na temat jawnych konstruktorów, zobacz Konwersje typów zdefiniowanych przez użytkownika.

  3. Problem może wystąpić, gdy zostanie podjęta próba skopiowania wystąpienia klasy zadeklarowanego const przy użyciu konstruktora kopii, który nie przyjmuje parametru const odwołania. Zadeklaruj konstruktor kopiujący za pomocą const odwołania typu zamiast odwołania do typu innego niż const.