c ++ Vorlagenkopierkonstruktor nicht verfügbar oder explizit

8

Ich habe einen Code mit Template-Copy-Konstruktor geschrieben, um das Konzept besser zu verstehen, da ich neu bin, aber der folgende Code nicht kompiliert werden kann

%Vor%

Beim Kompilieren des obigen Codes in Visual Studio erscheint folgender Fehler: -

FEHLER: -

  

Schweregrad Beschreibung Projektdateileitungsunterdrückungsstatus   Fehler C2558-Klasse 'Grid': Kein Kopierkonstruktor verfügbar oder Kopierkonstruktor wird als 'Explizit' deklariert

Ich habe versucht, die Vorlage des Arguments durch E zu ersetzen und es zeigt mehr Fehler (seltsame)

%Vor%

Fehler:

  

Schweregrad Beschreibung Projektdateileitungsunterdrückungsstatus   Fehler LNK2019 nicht aufgelöstes externes Symbol "public: __thiscall Grid :: Grid (unsigned int, unsigned int)" (?? 0? $ Grid @ N @@ QAE @ II @ Z) referenziert in der Funktion _main

     

Fehler LNK1120 2 nicht aufgelöste externe

     

Fehler LNK2019 nicht aufgelöstes externes Symbol "public: virtuelles __thiscall Grid :: ~ Grid (void)" (?? 1? $ Grid @ N @@ UAE @ XZ) referenziert in der Funktion "public: virtual void * __thiscall Grid :: 'skalarer Löschdestruktor' (unsigned int) "(?? _G? $ Grid @ N @@ UAEPAXI @ Z)

    
Harshul Sharma 07.06.2016, 13:04
quelle

3 Antworten

9

Ein Vorlagenkonstruktor ist niemals (!) ein Kopierkonstruktor. Der Konstruktor in Ihrem Code ist nur ein Konvertierungskonstruktor.

Vielleicht möchten Sie beide:

%Vor%

Siehe auch:

Dieter Lücking 07.06.2016, 13:56
quelle
1

Beachten Sie, dass Grid<T>(Grid<U> const&) technisch gesehen kein Kopierkonstruktor ist, sondern ein Konvertierungskonstruktor. Der Compiler generiert immer noch einen Kopierkonstruktor für Sie.

    
Maxim Egorushkin 07.06.2016 13:56
quelle
1

Die Sache, die Sie als gefährlichen Fehler bezeichnen, geschieht aufgrund Ihrer dummen Fehler: -

1) Sie haben Deklarationen für Konstruktoren und Destruktoren angegeben. Und wie Sie sagen, dass es Ihre einzige Quelldatei ist. Es bedeutet, dass Sie sie nicht definiert haben, und das ist der Grund für die Linkfehler, die Sie erhalten. Manchmal können sich diese ziemlich einfachen Probleme als sehr gefährlich und zeitaufwendig erweisen.

Sie hätten das Semikolon durch ein Paar geschweifter Klammern ersetzen können, wenn Sie keine detaillierte Implementierung bereitstellen möchten.

2) Die Sache, die Sie versuchen zu tun, ist völlig logiklos, da Sie einen Konverter-Konstruktor mit der Signatur erstellen, die dem Kopierkonstruktor ähnlich ist. Trotzdem wird der Compiler den Kopierkonstruktor dem Converter vorziehen.

Letztendlich wird Ihre Definition für den Konstruktor niemals wirklich aufgerufen.

    
Sharma harsh 07.06.2016 16:55
quelle

Tags und Links