Avertissement de l'éditeur de liens MSVC ++ lors de l'utilisation de l'idiome PIMPL dans C ++ / CLI
-
22-07-2019 - |
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.
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.