【问题标题】:Why linker error but not compile error when copying rapidjson::Document?为什么在复制 rapidjson::Document 时出现链接器错误而不是编译错误?
【发布时间】:2015-03-31 07:20:02
【问题描述】:

rapidjson::Document复制结果到链接出错:

Error 5 error LNK2019: unresolved external symbol "private: __thiscall rapidjson::GenericValue,class rapidjson::MemoryPoolAllocator >::GenericValue,class rapidjson::MemoryPoolAllocator >(class rapidjson::GenericValue,class rapidjson::MemoryPoolAllocator > const &)" (??0?$GenericValue@U?$UTF8@D@rapidjson@@V?$MemoryPoolAllocator@VCrtAllocator@rapidjson@@@2@@rapidjson@@AAE@ABV01@@Z) 在函数“public”中引用: __thiscall rapidjson::GenericDocument,class rapidjson::MemoryPoolAllocator >::GenericDocument,class rapidjson::MemoryPoolAllocator >(class rapidjson::GenericDocument,class rapidjson::MemoryPoolAllocator > const &)" (??0?$GenericDocument@U? $UTF8@D@rapidjson@@V?$MemoryPoolAllocator@VCrtAllocator@rapidjson@@@2@@rapidjson@@QAE@ABV01@@Z) C:\Layer.obj

我看到rapidjson::Documentrapidjson::GenericValue 的孩子 没有复制构造函数:

    //! Copy constructor is not permitted.
private:
    GenericValue(const GenericValue& rhs);

我想知道为什么没有编译器错误而是链接器错误? C++ 试图做什么?

我使用 MVC 2013 和 rapidjson 0.11。这里也有类似的主题:

  1. LNK2019: "Unresolved external symbol" with rapidjson
  2. Rapidjson cannot copy `rapidjson::Document`

【问题讨论】:

    标签: c++ linker-errors rapidjson


    【解决方案1】:

    您已经部分回答了自己的问题:

        //! Copy constructor is not permitted.
    private:
        GenericValue(const GenericValue& rhs);
    

    所有类都有一个隐式复制构造函数: http://en.cppreference.com/w/cpp/language/copy_constructor#Implicitly-declared_copy_constructor

    这段代码的作者试图通过在没有定义的情况下声明隐式复制构造函数来禁用它。通过声明,此代码可以编译。如果没有定义,则无法链接,因此您会看到错误。

    更具体地说,您看到的错误消息翻译如下:“GenericDocument 类的隐式复制构造函数正在调用 GenericValue 类的隐式复制构造函数。GenericValue 类中的复制构造函数已声明但未定义。”您看到的文字本身就更加具体,但显然更难阅读。

    在您的代码(可能是使用 rapidjson 的代码)中,存在对 GenericDocument 的复制构造函数的意外或故意调用,这给您带来了整个问题。就我而言,我将 GenericDocument 作为参数传递给函数。如果你在做同样的事情,你应该通过引用传递文档,所以它不会被复制。

    【讨论】:

      【解决方案2】:

      错误意味着声明了一个函数但没有实现。 所以你必须有一些 .h 声明了一些函数,但没有在你拥有的 Rapidjson 的任何地方实现。

      【讨论】:

      • 但是如果复制构造函数是私有的并且没有实现,为什么我没有得到编译错误?这实际上是我的问题。
      • @Narek 这可能表明某些类自己的代码使用了复制构造函数。或编译器错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多