У меня есть проект 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: неразрешенный внешний символ «private: __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: 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)
Ошибка исчезает, когда я комментирую строку с комментариями ЗДЕСЬ ПРОБЛЕМА в коде. Как вы можете видеть, использование test
переменная в coreBD
класс не вызывает ошибок. Простое существование переменной типа rapidjson::Document
во вложенном классе вызывает отображение ошибки de; не имеет значения, использую я это или нет.
В чем может быть проблема?
РЕДАКТИРОВАТЬ:
Новая информация собралась.
Проблема возникает, когда я использую вложенный класс внутри родительского, но только в return
метода. Другими словами: я могу создать все с rapidjson::Document
введите в качестве переменной-члена, я могу создать метод в coreBD
класс с типом jsonObj
Я могу создать экземпляр jsonObj
внутри этого метода, но я не могу вернуть значение типа jsonObj
если класс jsonObj
имеет rapidjson::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
}
РЕДАКТИРОВАТЬ:
Новый вопрос, продолжающий решение этого: Выполнить копию документа объекта quickjson
Глядя на ошибку, кажется, что функция, возвращающая jsonObj
выполняет некоторую конструкцию копирования или перемещения как часть возврата значения, и базовые классы не позволяют этого, вероятно, делая эти конструкторы частными членами.
Существуют классы, дизайн которых требует, чтобы копирование или присвоение было запрещено для предотвращения утечек памяти или потому, что объекты являются объектами одноэлементного типа, и разрешена только одна версия объекта.
Смотря на это документация по рапиджсону в разделе о семантике Move есть примечание, которое может быть уместным. Похоже, что они предотвращают копирование для повышения производительности.
jsonObj не имеет конструктора копирования и не может иметь конструктора копирования, так как конструктор копирования Document отключен в rapidjson
попробуйте вместо этого удерживать указатель на документ, что-то вроде этого:
class jsonObj {
string jsonStr;
string message;
Document* doc; //HERE IS THE PROBLEM
bool validMsg;
}
или передать документ (jsonObj) извне
jsonObj query(string sSQL);
например:
query(string sSQL, jsonObj & out_obj)