2

我有一个 Visual C++ 项目,我在其中添加了 rapidjson 库,该库经过测试可以正常工作。但是当我rapidjson::Document向嵌套类添加类型时,LNK2019当我尝试编译时会引发错误。该项目是用于创建 DLL 的动态库。

这是我的main.h中的定义:

class coreBD {
string conn;
string proxy;
int type;
Document test;

enum dataBases {
    Sqlite,
    SqlServer,
    None
};

string queryBD(string sSQL);
string queryHTTP(string sSQL);

string httpRequest(string url, string proxy);

static string getNow(string format);
static string urlEncode(string url);
static bool startsWith(string source, string with);

public:

enum access {
    dbConn,
    HTTPProtocol
};

//Nested class
class jsonObj {
    string jsonStr;
    string message;
    Document doc; //HERE IS THE PROBLEM
    bool validMsg;

public:
    enum response {
        FullResponse,
        SQLResponse
    };

    jsonObj(string json);
    string getJsonStr(response rType);
    string getErrorMsg();
    bool isValidResponse();
};

coreBD(string connStr, access connType);
jsonObj query(string sSQL);
void setProxy(string proxy);
};

这是错误:

错误 LNK1120:1 未解决的外部

错误 LNK2019:未解析的外部符号“私有:__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)

当我评论代码中用HERE IS THE PROBLEM注释的行时,错误消失了。如您所见,在类中使用test变量coreBD不会导致错误。嵌套类中仅存在类型变量rapidjson::Document会导致显示错误;我是否使用它并不重要。

可能是什么问题呢?


编辑

收集到的新信息。

当我在父类中使用嵌套类时会出现问题,但仅在return方法中。换句话说:我可以用rapidjson::Documenttype 作为成员变量来创建所有东西,我可以在coreBDclass 中用 type创建一个方法,我可以在该方法jsonObj中实例化,但是如果类声明了一个成员变量,我就不能返回 type 的值。jsonObjjsonObjjsonObjrapidjson::Document

例如这个新创建的方法:

jsonObj coreBD::testOBJ()
{
    string json = "{error:null, message:None, errorMessage:MoreNone}";
    jsonObj b(json);
    return b; //It fails here if I return a nested class with a rapidjson::Document in it. Returning NULL works
}

编辑

继续解决此问题的新问题:执行 rapidjson 的 Document 对象的副本

4

2 回答 2

1

查看错误,返回的函数似乎jsonObj正在执行某种复制或移动构造作为返回值的一部分,而底层类可能通过使这些构造函数成为私有成员而不允许这样做。

有些类的设计要求禁止复制或赋值,以防止内存泄漏,或者因为对象是单例类型对象并且只允许对象的一个​​版本。

查看有关 rapidjson 的文档,在移动语义部分中有一个可能相关的注释。看起来他们正在阻止复制以提高性能。

于 2014-03-27T15:44:11.593 回答
0

jsonObj没有复制构造函数,也没有任何复制构造函数,因为在 rapidjson 中禁用了 Document 的复制构造函数。尝试保持指向文档的指针,如下所示:

class jsonObj {
    string jsonStr;
    string message;
    Document* doc; //HERE IS THE PROBLEM
    bool validMsg;
}

或者将 document( jsonObj) 从外部传递到:

jsonObj query(string sSQL);

例如:

query(string sSQL, jsonObj & out_obj)
于 2018-12-04T16:05:09.807 回答