LNK2019: неразрешенный внешний символ с Rapidjson

У меня есть проект 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 _ , если в классе 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


person SysDragon    schedule 27.03.2014    source источник
comment
добавьте файл библиотеки rapidjason в качестве ссылки на свойства вашего проекта.   -  person Elixir Techne    schedule 27.03.2014
comment
@Trinity rapidjson - это только заголовки, которые включены в мой проект с #includes, и, как вы можете прочитать, библиотека работает правильно во всех остальных частях моего проекта   -  person SysDragon    schedule 27.03.2014
comment
Неужели это отдельное решение? Это означает, что остальные рабочие части вашего приложения размещаются в разных решениях вашего проекта.   -  person XAMlMAX    schedule 27.03.2014
comment
@XAMlMAX Нет. Одно уникальное решение. У меня тоже есть оболочка C ++ / CLI, если это важно. А проект - это динамическая библиотека.   -  person SysDragon    schedule 27.03.2014
comment
Вы используете это rapidjson::Document где-нибудь еще в своем проекте? Я знаю, вы сказали, что он работает везде в решении, но работает ли rapidjson::Document и везде?   -  person XAMlMAX    schedule 27.03.2014
comment
@XAMlMAX Да, работает. Как видите, я даже добавил переменную Document test в основной класс, и это не вызывает проблем. Он терпит неудачу только во вложенном классе, и я не могу понять, почему.   -  person SysDragon    schedule 27.03.2014
comment
Приношу свои извинения :-) просто прочитайте код еще раз и заметите его прямо вверху :-)   -  person XAMlMAX    schedule 27.03.2014
comment
@XAMlMAX Пожалуйста, посмотрите мою редакцию.   -  person SysDragon    schedule 27.03.2014
comment
Мне кажется, что возникла проблема с созданным кодом копирования или перемещения. Шаблон не создает необходимую копию или конструктор перемещения?   -  person Richard Chambers    schedule 27.03.2014
comment
@RichardChambers Не используется автоматический код. Для классов не определен конструктор копирования или перемещения. Нужно вернуть объект класса?   -  person SysDragon    schedule 27.03.2014
comment
@SysDragon, область конструкторов копирования и конструкторов перемещения для меня тоже серая область, особенно для возвращаемых объектов, поэтому я боюсь, что не смогу дать конкретных советов. Мне просто кажется, что компилятор хочет использовать что-то из Rapidjson, которое недоступно. И я знаю, что для предотвращения использования копирования, перемещения или присваивания для определенного класса использование private: с объявлениями методов в классе используется для ограничения использования этих методов.   -  person Richard Chambers    schedule 27.03.2014
comment
Эта статья о возвращении объектов в C ++ может стать отправной точкой bogotobogo.com/cplusplus/object_returning.php < / а>   -  person Richard Chambers    schedule 27.03.2014
comment
@RichardChambers Вы были правы. Похоже, проблема в копии rapidjson::Document объектов. Я делаю свой собственный конструктор копирования, и когда я пытаюсь скопировать элементы Document, он говорит, что оператор = недоступен. Подумайте о добавлении ответа с этой информацией.   -  person SysDragon    schedule 27.03.2014


Ответы (2)


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

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

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

person Richard Chambers    schedule 27.03.2014
comment
Похоже, что часть документации, относящаяся к объекту Document, отсутствует. - person SysDragon; 27.03.2014
comment
@SysDragon, я думаю, вы правы, документация кажется неполной. Однако есть раздел, озаглавленный «Переместить семантику» примерно на 2/3 сверху вниз, в котором обсуждаются присвоение, копирование и перемещение. В целом документация кажется довольно скудной. В включаемом файле document.h есть комментарий о том, что конструктор копирования не разрешен, см. Строку 54 code.google.com/p/rapidjson/source/browse/trunk/include/. - person Richard Chambers; 27.03.2014
comment
Это проблема, с которой я столкнулся сейчас. Я не могу определить конструктор копирования, потому что не могу получить доступ к закрытому члену. Я пытаюсь использовать метод Document.Accept(), который, похоже, выполняет копию: stackoverflow.com/a/19604013/1967056 - person SysDragon; 28.03.2014
comment
Я думаю, я собираюсь создать новый вопрос, поскольку он зашел слишком далеко и отличается от исходной проблемы и продолжает расти. слишком. Спасибо за вашу помощь. Смотрите мою правку. - person SysDragon; 28.03.2014

jsonObj не имеет конструктора копирования и не может иметь конструктора копирования, поскольку конструктор копирования документа отключен в 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)
person Roman    schedule 04.12.2018