c++ - remove - LNK2019: "Símbolo externo sin resolver" con rapidjson
json c++ tutorial (1)
Al jsonObj
el error, parece que la función que devuelve jsonObj
está realizando una especie de copia o movimiento de construcción como parte de la devolución del valor y las clases subyacentes no lo permiten, probablemente haciendo que esos constructores sean miembros privados.
Hay clases cuyo diseño requiere que se prohíba una copia o asignación para evitar fugas de memoria o porque los objetos son de tipo singleton y solo se permite una versión del objeto.
Al mirar esta documentación en rapidjson, hay una nota en la sección sobre Semántica de movimiento que puede ser pertinente. Parece que están impidiendo una copia para mejorar el rendimiento.
Tengo un proyecto de Visual C ++ en el que agregué la biblioteca rapidjson, que se ha probado que funciona correctamente. Pero cuando agrego un tipo de rapidjson::Document
a la clase anidada, arrojo un error LNK2019
cuando intento compilar. El proyecto es una biblioteca dinámica para crear una DLL.
Estas son las definiciones en mi 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);
};
Este es el error:
error LNK1120: 1 external externo sin resolver
error LNK2019: símbolo externo no resuelto "private: __thiscall rapidjson :: GenericValue, clase rapidjson :: MemoryPoolAllocator> :: GenericValue, clase rapidjson :: MemoryPoolAllocator> (clase rapidjson :: GenericValue, clase rapidjson :: MemoryPoolAllocator> const &)" (? ? 0? $ GenericValue @ U? $ UTF8 @ D @ rapidjson @@ V? $ MemoryPoolAllocator @ VCrtAllocator @ rapidjson @@@ 2 @@ rapidjson @@ AAE @ ABV01 @@ Z) referenciado en la función "public: __thiscall rapidjson :: GenericDocument, clase rapidjson :: MemoryPoolAllocator> :: GenericDocument, clase rapidjson :: MemoryPoolAllocator> (clase rapidjson :: GenericDocument, clase rapidjson :: MemoryPoolAllocator> const &) "(?? 0? $ GenericDocument @ U? $ UTF8 @ D @ rapidjson @@ V? $ MemoryPoolAllocator @ VCrtAllocator @ rapidjson @@@ 2 @@ rapidjson @@ QAE @ ABV01 @@ Z)
El error desaparece cuando comento la línea comentada con AQUÍ ES EL PROBLEMA en el código. Como puede ver, el uso de la variable de test
en la clase coreBD
no causa ningún error. La mera existencia de la variable de tipo rapidjson::Document
en la clase anidada hace que se muestre el error; no importa si lo uso o no.
¿Cual podría ser el problema?
EDITAR :
Nueva información recopilada.
El problema aparece cuando utilizo la clase anidada dentro del padre, pero solo en la return
de un método. En otras palabras: puedo crear todo con rapidjson::Document
Tipo de rapidjson::Document
como variable miembro, puedo crear un método en coreBD
class con tipo jsonObj
, puedo instanciar jsonObj
dentro de esos métodos, pero no puedo devolver un valor de tipo jsonObj
si el class jsonObj
tiene una variable de miembro de rapidjson::Document
declarada.
Por ejemplo, este nuevo método creado:
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
}
EDITAR :
Nueva pregunta que continúa resolviendo esto: Realice una copia del objeto Document of rapidjson