Avertissement de l'éditeur de liens MSVC ++ lors de l'utilisation de l'idiome PIMPL dans C ++ / CLI

StackOverflow https://stackoverflow.com/questions/335271

Question

J'écris un assemblage .NET à l'aide de C ++ / CLI (version 9.0) et j'aimerais utiliser l'idiome PIMPL pour éviter de placer des éléments inutiles dans mon en-tête public. Malheureusement, lorsque j'essaie de faire suivre une classe, puis que je l'utilise avec un handle de suivi, l'avertisseur Linker 4248 s'affiche:

  

warning LNK4248: Jeton typeref non résolu (0100000E) pour 'MyNamespace.PrivateClass'; l'image peut ne pas fonctionner

Cela semble être le cas, que j'utilise une classe CLI ou une classe native pour la classe d'implémentation.

Exemple de code affiché ci-dessous:

namespace MyNamespace
{
    ref class PrivateClass; // forward dec

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

Malheureusement, l'explication fournie par Microsoft pour l'avertissement n'est pas trop informative.

Était-ce utile?

La solution

Je pense que vous utilisez deux technologies qui ne s'assemblent pas vraiment bien:

L’application naturelle de pimpl consiste à éviter d’avoir à modifier constamment le fichier d’entête, ce qui entraînerait de grandes recompilations sur les grands projets C ++.

L’application naturelle de C ++ / cli est d’écrire de petits morceaux d’interopérabilité maigres, et le comportement par défaut de VS sur ces projets consiste à placer tout le code dans les en-têtes, ce qui est aussi anti-pimpl que vous pouvez l’obtenir.

Si vous écrivez quelque chose d'assez gros pour justifier pimpl, je ne recommanderais pas C ++ / cli. Si vous écrivez quelque chose assez petit pour rendre C ++ / cli approprié, pimpl ne me dérangerait pas.

YMMV bien sûr, mais ce serait mon point de vue ...

Autres conseils

Après avoir approfondi les recherches et réfléchi, j’ai découvert que, à certains égards, .NET n’a pas vraiment besoin de prendre en charge PIMPL de la même manière que C ++, car vous pouvez marquer une classe privée à un assemblage - c’est essentiellement le même à certains égards. Cependant, le langage PIMPL est souvent utilisé pour masquer des en-têtes que vous ne voulez pas que le client compile. Mais bien entendu, les assemblages .NET ne sont pas "inclus". comme les en-têtes pour C ++ sont - donc je suppose qu'il n'y a pas vraiment de problème là-bas non plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top