c++-cli - 在 C++/CLI 中使用 PIMPL 习惯用法时 MSVC++ 链接器警告

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

我正在使用 C++/CLI(版本 9.0)编写 .NET 程序集,并且我想使用 PIMPL 习惯用法来避免在公共(public) header 中放入不必要的内容。不幸的是,当我尝试转发声明一个类,然后使用它的跟踪句柄时,我收到链接器警告 4248:

warning LNK4248: unresolved typeref token (0100000E) for 'MyNamespace.PrivateClass'; image may not run

无论我使用 CLI 类还是 native 类作为实现类,情况似乎都是如此。

示例代码如下:

namespace MyNamespace
{
    ref class PrivateClass; // forward dec

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

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

最佳答案

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

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

C++/cli 的自然应用是编写精简的互操作片段,而 VS 在这些项目上的默认行为是将所有代码放入 header 中,这几乎是您所能得到的反 pimpl 的结果。

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

YMMV 当然,但这就是我的看法......

关于c++-cli - 在 C++/CLI 中使用 PIMPL 习惯用法时 MSVC++ 链接器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/335271/

相关文章:

Pimpl 习语上下文中的 C++17 自定义迭代器

include - #using、#include 和 'assembly references'——它们是什么以及它们之间的关系?

.net - 在 C++/CLI 中实现 IEnumerable<T>

.net - 在 C++/CLI 中创建具有空维度大小的多维数组

c++ - lnk4022 : undecorated symbol - how to fix?

c++ - C++ 中的 Pimpl 习语和私有(private)构造函数

C++写入具有 protected 内存的进程

c++ - 在 Visual Studio 2012 中跟踪 LNK1112 错误

c++ - 如何从派生类函数中调用虚函数

c++ - 当全局函数需要指向 impl 的指针时,如何防止 impl 细节出现在头文件中?