【问题标题】:Cannot use std::string variable in RapidJSON function call不能在 RapidJSON 函数调用中使用 std::string 变量
【发布时间】:2020-03-16 04:32:49
【问题描述】:

我是 C++ 新手,遇到了一个问题。我正在使用 rapidJSON 创建 JSON 文档。

void setKeyValue() {
        Value obj(kObjectType);
        Value key("key");
        Value val(42);;
        obj.AddMember(key, val, d.GetAllocator());
    }

按预期工作。但是当我尝试替换对 key 的调用以使其使用传入的参数时,如下所示:

void setKeyValue(string myKey) {
        Value obj(kObjectType);
        Value key(myKey);
        Value val(42);;
        obj.AddMember(key, val, d.GetAllocator());
    }

Value key(myKey) 中的 myKey 在 Visual Studio 中得到一个红色的下划线,说明如下:

这是什么原因造成的,我该如何解决?

【问题讨论】:

  • 您是否检查过Value 的构造函数是否采用std::string"key" 不是 std::string,以免引起您的困惑
  • 试试:mykey.c_str()
  • @foreknownas_463035818 我想这让我很困惑。在这种情况下,字符数组会是什么?
  • 如果你这样做有效果吗? #define RAPIDJSON_HAS_STDSTRING 1。请参阅此处了解您正在使用的docs of the constructor
  • @RuudVerhoef 字符串文字(不是std::string,请注意,这只是 STL 的库类型,即它没有被特殊处理)。

标签: c++ c++17 rapidjson


【解决方案1】:

默认情况下,您不会获得对 std::string 的支持。 rapidJSON 需要你specify 你想要std::string 支持。

#define RAPIDJSON_HAS_STDSTRING 1

只有这样你使用的constructor才有效:

GenericValue (const std::basic_string< Ch > &s, Allocator &allocator)

【讨论】:

    【解决方案2】:

    您使用的 JSON 库似乎不适用于标准库中的字符串对象,但它适用于 const char*。

    所以你必须使用 c_str() 方法将字符串对象转换为 char*:

    void setKeyValue(string myKey) {
            Value obj(kObjectType);
            Value key((char*)myKey.c_str());
            Value val(42);;
            obj.AddMember(key, val, d.GetAllocator());
        }
    

    【讨论】:

    • 我刚刚尝试复制您的答案,但是这可能已经解决了我遇到的问题,但仍然导致在同一个单词下方出现一条红色花线:C++ 没有构造函数实例与参数列表参数类型匹配: (常量字符 *)。我猜我仍然没有传入正确类型的数据。
    • 那你可以强制强制转换,我修改解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多