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;
    };
}

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

4

2 回答 2

2

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

pimpl 的自然应用是避免必须一直更改头文件,从而导致大型 C++ 项目的大量重新编译。

C++/cli 的自然应用是编写精简的小互操作块,VS 在这些项目上的默认行为是将所有代码放入标头中,这与您可以得到的反 pimpl 差不多。

如果您正在编写足够大的内容以保证 pimpl,我不会推荐 C++/cli。如果您正在编写足够小的东西以使 C++/cli 适合,我不会为 pimpl 烦恼。

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

于 2008-12-04T21:37:20.197 回答
1

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

于 2008-12-04T21:12:19.140 回答