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)
Ein Vorlagenkonstruktor ist niemals (!) ein Kopierkonstruktor. Der Konstruktor in Ihrem Code ist nur ein Konvertierungskonstruktor.
Vielleicht möchten Sie beide:
%Vor%Siehe auch:
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.
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.
Tags und Links c++