У меня есть проект 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, class rapidjson :: MemoryPoolAllocator> :: GenericValue, class rapidjson :: MemoryPoolAllocator> (class rapidjson :: GenericValue, class rapidjson :: MemoryPoolAllocator?>" __Thiscall rapidjson :: GenericDocument, класс 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)
Ошибка исчезает, когда я прокомментирую строку кода с пометкой ВОТ ПРОБЛЕМА. Как видите, использование переменной test
в классе coreBD
не вызывает ошибок. Простое существование переменной типа rapidjson::Document
во вложенном классе вызывает отображение ошибки; не имеет значения, использую я это или нет.
В чем может быть проблема?
ИЗМЕНИТЬ:
Собрана новая информация.
Проблема возникает, когда я использую вложенный класс внутри родительского, но только в return
метода. Другими словами: я могу создать все с типом rapidjson::Document
в качестве переменной-члена, я могу создать метод в классе coreBD
с типом jsonObj
, я могу создать экземпляр jsonObj
внутри этих методов, но я не могу вернуть значение типа _12 _ strong>, если в классе 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
}
ИЗМЕНИТЬ:
Новый вопрос, продолжающий решать эту проблему: Выполнить копию объекта документа Rapidjson
#include
s, и, как вы можете прочитать, библиотека работает правильно во всех остальных частях моего проекта - person SysDragon   schedule 27.03.2014rapidjson::Document
где-нибудь еще в своем проекте? Я знаю, вы сказали, что он работает везде в решении, но работает лиrapidjson::Document
и везде? - person XAMlMAX   schedule 27.03.2014Document test
в основной класс, и это не вызывает проблем. Он терпит неудачу только во вложенном классе, и я не могу понять, почему. - person SysDragon   schedule 27.03.2014private:
с объявлениями методов в классе используется для ограничения использования этих методов. - person Richard Chambers   schedule 27.03.2014rapidjson::Document
объектов. Я делаю свой собственный конструктор копирования, и когда я пытаюсь скопировать элементыDocument
, он говорит, что оператор = недоступен. Подумайте о добавлении ответа с этой информацией. - person SysDragon   schedule 27.03.2014