在C ++ / CLI中使用PIMPL惯用语时的MSVC ++链接器警告

时间:2008-12-02 20:16:37

标签: c++-cli linker-errors pimpl-idiom

我正在使用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;
    };
}

不幸的是,微软对该警告的解释并没有太多信息。

2 个答案:

答案 0 :(得分:2)

我认为你正在使用两种并不能很好地结合在一起的技术:

pimpl的自然应用是避免不断更改头文件,从而对大型C ++项目进行大量重新编译。

C ++ / cli的自然应用是编写一些瘦小的互操作片段,VS在这些项目中的默认行为是将所有代码放入标题中,这就像你可以得到的反pimpl一样。 / p>

如果你正在写一些足以保证pimpl的东西,我不会推荐使用C ++ / cli。如果你正在编写足够小的东西以使C ++ / cli合适,我就不会打扰pimpl了。

YMMV当然,但那是我对它的看法......

答案 1 :(得分:1)

在进一步挖掘和反思后,我发现在某些方面,.NET并不需要像C ++一样支持PIMPL,因为你可以将一个类标记为一个私有的程序集 - 这基本上具有相同的效果,从某种角度。但是,通常使用PIMPL惯用法来隐藏您不希望客户端必须编译的头文件。但是当然.NET程序集不像C ++的标题那样被“包含” - 所以我想那里确实没有问题。