2

C++/CLI (バージョン 9.0) を使用して .NET アセンブリを作成しています。PIMPL イディオムを使用して、パブリック ヘッダーに不要なものを入れないようにしたいと考えています。残念ながら、クラスを前方宣言して追跡ハンドルを使用しようとすると、リンカー警告 4248 が表示されます。

警告 LNK4248: 'MyNamespace.PrivateClass' の未解決の typeref トークン (0100000E); イメージが実行されない場合があります

これは、実装クラスに CLI クラスを使用する場合でも、ネイティブ クラスを使用する場合でも同じようです。

コード例を以下に示します。

namespace MyNamespace
{
    ref class PrivateClass; // forward dec

    ref class MyPublicClass
    {
    private:
        PrivateClass^ m_Imp;
    };
}

残念ながら、警告に関する Microsoft の説明はあまり有益ではありません。

4

2 に答える 2

2

私はあなたが実際にはうまく調和していない2つの技術を使用していると思います:

pimpl の自然な用途は、常にヘッダー ファイルを変更する必要がなく、それによって大規模な C++ プロジェクトで大規模な再コンパイルが発生することを回避することです。

C++/cli の自然なアプリケーションは、スキニーで小さな相互運用機能を記述することであり、これらのプロジェクトでの VS のデフォルトの動作は、すべてのコードをヘッダーに入れることです。

pimpl を正当化するのに十分な大きさのものを書いている場合は、C++/cli はお勧めしません。C++/cli を適切にするのに十分なほど小さなものを書いているのであれば、私は pimpl を気にしません。

もちろんYMMVですが、それは私の見解です...

于 2008-12-04T21:37:20.197 に答える
1

さらに掘り下げて熟考したところ、いくつかの点で.NETはC++と同じ方法でPIMPLをサポートする必要がないことがわかりました。これは、クラスをアセンブリに対してプライベートにマークできるためです。これは、いくつかの点で本質的に同じ効果があります。ただし、多くの場合、PIMPL イディオムは、クライアントにコンパイルさせたくないヘッダーを隠すために使用されます。しかし、もちろん、C++ のヘッダーのように .NET アセンブリは「インクルード」されていないため、そこにも問題はないと思います。

于 2008-12-04T21:12:19.140 に答える