2017-02-15 70 views
0

我试图比较rapidjson文档,但它给出了一个错误消息,我不知道如何解决(见上文)。比较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

我遇到了类似的问题。 查看/尝试的内容:

1)您是否在您的相关代码块中有using namespace rapidjson;?我假设不是因为我看到你在你的orgiDocument声明中使用rapidjson::。我相信这个问题的一部分就像命名空间冲突一样简单。 (编译器不知道你正在尝试使用rapidjson的超载[]运算符...我认为)。

2)我建议的第二件事是尝试使用newDocument["read"].GetBool()来检索“读“键。我一直在试图让我的代码工作,同时遵循该教程,并且使用这些'Get'方法是我能够真正获得返回值的唯一方法。

希望这会有所帮助!

0
  1. 什么是newDocument的类型,以及如何创建它?我试着运行你的代码(通过与origDocument相同的方式创建NewDocument),并且第一个==声明有效。如果newDocument是常规的rapidjson::Document,则应该编译行const rapidjson::Value& a1 = newDocument["read"];

  2. 第二个断言试图strcmp两个rapidjson值对象,所以我认为这是预计不会编译。您应该使用各自的.GetString()中的值获取const char*的内容。

只是为了清楚,你想做的事应该工作什么:

  • operator[]Document(实际上是在minilang中的一个子类)返回一个GenericValue对象引用。

  • 您可以将GenericValues与期望的运算符==和!=进行比较。请参阅“等于和不等于运算符”部分in the docs

相关问题