3

私は私の手に謎を持っています。私は C# のバックグラウンドからマネージ C++ を学ぼうとしていますが、問題が発生しました。基本クラスSoupと、静的ライブラリ (.lib) としてコンパイルする派生クラスTomatoSoupの 2 つのクラスを含むプロジェクトがある場合、 Soupの仮想メソッドで未解決のトークンを取得します。コードは次のとおりです。


Abstracts.proj

スープ.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;
    };
}

トマトスープ.cpp

#include "TomatoSoup.h"

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

Main.proj

メイン.cpp

#include "TomatoSoup.h"

using namespace System;

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

    return 0;
}

Main.projで次のリンク時エラーが発生します。

1>Main.obj : error LNK2020: unresolved token (06000001) Abstracts.Soup::heat
  1. 設定してみました

    virtual void heat(int Degrees)=0;
    
  2. 基本クラスに熱を実装してみました

    virtual void heat(int Degrees){} 
    

    エラーとして扱われる参照されていない仮パラメーターの警告を取得します。

  3. Soup クラスの abstract キーワードの有無にかかわらず、1 と 2 の両方を試しました

この問題は私を夢中にさせており、将来、他の開発者を狂わせないようにしたいと思っています。

更新: TomatoSoup::heat がヘッダー ファイルに実装されている場合、これは Greg Hewgill の引数名コメント メソッドで機能しましたが、実装を TomatoSoup.cpp に移動するとエラーが再発しました。それを反映するように質問を修正しました。

4

3 に答える 3

3

発生するエラー(LNK2020)は、リンカがAbstracts.Soup::heat関数の定義をどこにも見つけられないことを意味します。関数を宣言するとvirtual void heat(int Degrees);、リンカはどこかで定義された関数本体を見つけることを期待します。

関数本体を提供せず、サブクラスが最終的に関数をオーバーライドする必要がある場合は、ソリューション1で示したように実行する必要があります。

virtual void heat(int Degrees) = 0;

これは、関数を実装しないことをコンパイラーに通知します。あなたがそれをするとどうなりますか?

また、2番目のソリューションを参照して:

virtual void heat(int Degrees) {}

コンパイラは、関数内でDegreesパラメータを参照しないことを通知しています。C ++でこの警告を回避する1つの方法は、パラメーターに名前を付けないことです。

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

= 0ただし、空の実装を提供することは、純粋な仮想( )宣言とは少し異なります。

于 2008-12-10T18:01:43.310 に答える
2

Abstracts.projを静的ライブラリとしてビルドしようとしたため、このエラーが発生した可能性があります。.DLLに変更すると、すべて正常に機能しました。

静的ライブラリからサポートされていないマネージコードについての言及を見てきましたが、公式なものは何もありません。誰かがこれを述べている良い参考文献を持っていますか?

于 2008-12-10T23:21:45.320 に答える
0

CLI の経験はあまりありませんが、パブリックを使用して継承する必要があると思います。

public ref class TomatoSoup : public Abstracts::Soup

于 2008-12-10T18:15:14.813 に答える