我试图比较rapidjson文档,但它发出的错误信息是我不确定如何修复(见上文)。
这是rapidjson:
static const std::string& JSON()
{
static const std::string j =
"{"
"\"SimpleCompany:Manager\":{"
"\"read\":\"true\""
"\"update\":\"true\""
"\"delete\":\"true\""
"\"insert\":\"false\""
"},"
"\"SimpleCompany:Manager\":{"
"\"read\":\"true\""
"\"update\":\"true\""
"\"delete\":\"false\""
"\"insert\":\"false\""
"},"
"}";
return j;
}
这是我尝试比较两个文件可能相同的内容的地方:
rapidjson::StringStream strStream(JSON().c_str());
rapidjson::Document origDocument;
origDocument.ParseStream(strStream); //newDocument obtained other way
ASSERT_TRUE(newDocument["read"] == origDocument["read"]); //error no operator [] matches these operands
ASSERT_TRUE(strcmp(newDocument["read"] , origDocument["read"])); //error no operator [] matches these operands
const rapidjson::Value& a1 = newDocument["read"]; //error no operator [] matches these operands
知道如何正确比较他们的价值观吗?我尝试了两种方法,但他们并不喜欢[。
米洛说那里有一个equality operator。看起来我比较像rapidjson tutorial这样的东西,虽然他们正在将密钥与期望值进行比较,并且我比较两个文档的密钥是否相等,这对我来说似乎没问题。答案 0 :(得分:0)
我遇到了类似的问题。 要检查/尝试的事情:
1)您的相关代码块中是否有using namespace rapidjson;
?我假设不是因为我看到您在rapidjson::
声明中使用orgiDocument
。我相信这个问题的一部分就像命名空间碰撞一样简单。 (编译器不知道你正在尝试使用rapidjson的重载[]运算符......我想。)
2)我建议的第二件事是尝试使用newDocument["read"].GetBool()
来检索“读取”键的值。我一直在尝试让我的代码在遵循该教程的同时工作,并且使用这些'Get'方法是我能够实际获得返回值的唯一方法。
希望这有帮助!
答案 1 :(得分:0)
newDocument
的类型是什么,您如何创建它?我尝试运行您的代码(通过以NewDocument
创建origDocument
)并且第一个==
断言有效。如果newDocument
是常规rapidjson::Document
,则行const rapidjson::Value& a1 = newDocument["read"];
应该编译。
第二个断言是尝试strcmp
两个rapidjson Value对象,所以我认为它不会编译。您应该使用每个值const char*
从值中获取.GetString()
内容。
为了弄清楚,你想做什么应该有效:
operator[]
的{{1}}(实际上是GenericValue的子类)返回Document
对象引用。
您可以将GenericValues与预期的运算符==和!=进行比较。请参阅“等于和不等于操作员”部分in the docs。