复制rapidjson :: Document时为什么会出现链接器错误但没有编译错误?

时间:2015-03-31 07:20:02

标签: c++ linker-errors rapidjson

rapidjson::Document将结果复制到链接错误:

  

错误5错误LNK2019:未解析的外部符号"私人:__ thiscall rapidjson :: GenericValue,类rapidjson :: MemoryPoolAllocator> :: GenericValue,类rapidjson :: MemoryPoolAllocator>(类rapidjson :: GenericValue,类rapidjson :: MemoryPoolAllocator> const&)" (?? 0?$ GenericValue @ U?$ UTF8 @ D @ rapidjson @@ V?$ MemoryPoolAllocator @ VCrtAllocator @ rapidjson @@@ 2 @@ rapidjson @@ AAE @ ABV01 @@ Z)在函数" public中引用:__thiscall rapidjson :: GenericDocument,类rapidjson :: MemoryPoolAllocator> :: GenericDocument,类rapidjson :: MemoryPoolAllocator>(类rapidjson :: GenericDocument,类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`

2 个答案:

答案 0 :(得分: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作为参数传递给函数。如果您正在做同样的事情,您应该通过引用传递文档,因此不会复制它。

答案 1 :(得分:0)

错误表示声明了一个函数,但未实现。 所以你必须有一些.h声明一些功能,但是你没有在Rapidjson的任何地方实现。