所有,

class __declspec(dllexport) MyClass
{
protected:
    struct Impl;
    Impl *pimpl;
public:
    Impl &GetStruct() { return pimpl; }
    const std::wstring &GetName() { return pimpl->m_name; };
};

struct MyClass::Impl
{
    std::wstring m_name;
};


为什么有GetName()引发错误而GetStruct()没有引发错误的原因?以及如何修改代码以进行编译?

TIA!

最佳答案

问题是C ++解析器从上到下工作。在MyClass声明的末尾,嵌套的Impl尚未完全定义。它被声明(“有一个Impl结构”),但是完整的定义(“ Impl结构如下……”)仅在以后出现。但是,为了生成pimpl->m_name的代码,编译器需要了解更多,尤其是需要知道m_name是什么类型,以及它所在的包含Impl的偏移量。

简而言之,您偶然发现了PIMPL惯用语的一个著名限制,即您不能像以前那样使用内联函数。

关于c++ - C2027:使用未定义的类型Foo::Impl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52417960/

10-11 16:07