我正在使用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;
};
}
不幸的是,微软对该警告的解释并没有太多信息。
答案 0 :(得分:2)
我认为你正在使用两种并不能很好地结合在一起的技术:
pimpl的自然应用是避免不断更改头文件,从而对大型C ++项目进行大量重新编译。
C ++ / cli的自然应用是编写一些瘦小的互操作片段,VS在这些项目中的默认行为是将所有代码放入标题中,这就像你可以得到的反pimpl一样。 / p>
如果你正在写一些足以保证pimpl的东西,我不会推荐使用C ++ / cli。如果你正在编写足够小的东西以使C ++ / cli合适,我就不会打扰pimpl了。
YMMV当然,但那是我对它的看法......
答案 1 :(得分:1)
在进一步挖掘和反思后,我发现在某些方面,.NET并不需要像C ++一样支持PIMPL,因为你可以将一个类标记为一个私有的程序集 - 这基本上具有相同的效果,从某种角度。但是,通常使用PIMPL惯用法来隐藏您不希望客户端必须编译的头文件。但是当然.NET程序集不像C ++的标题那样被“包含” - 所以我想那里确实没有问题。