Frage

Ich habe ein Geheimnis auf meine Hände. Ich versuche, Managed C ++ aus einem C # -Hintergrund kommen zu lernen und haben sich zu einem Haken laufen. Wenn ich ein Projekt haben, die zwei Klassen umfasst, eine Basisklasse Soup und eine abgeleitete Klasse Tomatensuppe , die ich als eine statische Bibliothek kompilieren (LIB), erhalte ich ungelöste Token auf die virtuellen Methoden in Soup . Hier ist der Code:


Abstracts.proj

Soup.h

namespace Abstracts
{
    public ref class Soup abstract
    {
    public:
        virtual void heat(int Degrees);
    };
}

TomatoSoup.h

#include "Soup.h"

namespace Abstracts
{
    public ref class TomatoSoup : Abstracts::Soup
    {
    public:
        virtual void heat(int Degrees) override;
    };
}

TomatoSoup.cpp

#include "TomatoSoup.h"

void Abstracts::TomatoSoup::heat(int Degrees)
{
    System::Console::WriteLine("Soup's on.");
}

Main.proj

Main.cpp

#include "TomatoSoup.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    Abstracts::TomatoSoup^ ts = gcnew Abstracts::TomatoSoup();

    return 0;
}

ich diesen Link Zeitfehler auf Main.proj :

1>Main.obj : error LNK2020: unresolved token (06000001) Abstracts.Soup::heat
  1. Ich habe versucht Einstellung

    virtual void heat(int Degrees)=0;
    
  2. Ich habe versucht, Wärme in der Basisklasse Umsetzung

    virtual void heat(int Degrees){} 
    

    und erhalten eine nicht referenzierte formale Parameter Warnung als ein behandelt Fehler.

  3. Ich habe versucht beide 1 und 2 mit und ohne das Schlüsselwort abstract auf die Suppe Klasse

Dieses Problem macht mich verrückt und ich hoffe, es zu verhindern, dass die Fahrt andere Entwickler Nüsse in der Zukunft.

UPDATE: Das funktionierte mit Greg Hewgill Argument-Namen zu kommentieren Methode, wenn die Tomatensuppe :: Wärme in der Header-Datei implementiert wurde, aber der Fehler kam zurück, als ich die Umsetzung zu TomatoSoup.cpp bewegte. Ich habe die Frage geändert, dass zu reflektieren.

War es hilfreich?

Lösung

Der Fehler, den Sie bekommen (LNK2020) bedeutet, dass der Linker keine Definition für die Abstracts.Soup::heat Funktion überall finden kann. Wenn Sie die Funktion als virtual void heat(int Degrees); der Linker erklären wird erwarten, dass der Funktionskörper irgendwo definiert zu finden.

Wenn Sie beabsichtigen, keine Funktion Körper zu liefern, und verlangen, dass Subklassen schließlich die Funktion außer Kraft setzen, sollten Sie tun, wie Sie in der Lösung angezeigt 1:

virtual void heat(int Degrees) = 0;

Das sagt dem Compiler, dass Sie gehen, um die Funktion zu implementieren. Was passiert, wenn Sie das tun?

Auch mit Bezug auf Ihre zweite Lösung:

virtual void heat(int Degrees) {}

Der Compiler sagt Ihnen, dass Sie den Grad Parameter innerhalb der Funktion nicht verweisen. Eine Möglichkeit, diese Warnung in C ++ zu vermeiden, ist nicht dem Parameter einen Namen zu geben:

virtual void heat(int /*Degrees*/) {}

eine leere Implementierung Versorgung ist ein bisschen anders aus einer rein virtuellen (= 0) Erklärung, though.

Andere Tipps

Ich denke, dieser Fehler aufgetreten sein kann, weil ich versuche, Abstracts.proj als eine statische Bibliothek zu bauen. Als ich es einen .dll geändert, alles hat gut funktioniert.

Ich habe erwähnt verwaltetem Code gesehen nicht aus statischen Bibliotheken unterstützt werden, aber nichts offiziell. Hat jemand eine gute Referenz, die diese Staaten?

Ich habe nicht viel CLI Erfahrung haben, aber ich denke, Sie sollten mit den öffentlichen erbt:

public ref class Tomatensuppe: Öffentlichkeit Abstracts :: Soup

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top