LNK2019: «Неразрешенный внешний символ»; с рапиджсоном

У меня есть проект 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

2

Решение

Глядя на ошибку, кажется, что функция, возвращающая jsonObj выполняет некоторую конструкцию копирования или перемещения как часть возврата значения, и базовые классы не позволяют этого, вероятно, делая эти конструкторы частными членами.

Существуют классы, дизайн которых требует, чтобы копирование или присвоение было запрещено для предотвращения утечек памяти или потому, что объекты являются объектами одноэлементного типа, и разрешена только одна версия объекта.

Смотря на это документация по рапиджсону в разделе о семантике Move есть примечание, которое может быть уместным. Похоже, что они предотвращают копирование для повышения производительности.

1

Другие решения

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)
0

По вопросам рекламы [email protected]