#include "rapidjson/document.h"
int main(){
using namespace rapidjson ;
using namespace std ;
Document doc ;
Value obj(kObjectType) ;
obj.AddMember("key", "value", doc.GetAllocator()) ; //this compiles fine
obj.AddMember("key", string("value").c_str(), doc.GetAllocator()) ; //this does not compile!
}
我猜想是错误的,因为其中一行可以编译而另一行却不能。
AddMember
方法有很多变体,如文档所述,但除此之外...为什么.c_str()
的返回值不等于字符串字面值?我的理解是,无论何处都可以接受字符串字面值,你都可以传递
string::c_str()
并且它应该可以工作。附注:我正在使用VC++ 2010进行编译。
编辑: 缺少
#include <string>
不是问题。它已由document.h
包含。错误内容如下:
error C2664: 'rapidjson::GenericValue<Encoding> &rapidjson::GenericValue<Encoding>::AddMember(rapidjson::GenericValue<Encoding> &,rapidjson::GenericValue<Encoding> &,Allocator &)'
: cannot convert parameter 1 from 'const char [4]' to 'rapidjson::GenericValue<Encoding> &'
with
[
Encoding=rapidjson::UTF8<>,
Allocator=rapidjson::MemoryPoolAllocator<>
]
and
[
Encoding=rapidjson::UTF8<>
]
编辑2:
请忽略在临时值上调用.c_str()
的事实。这个例子只是为了显示编译错误。实际代码使用字符串变量。
编辑3:
该代码的备选版本:
string str("value") ;
obj.AddMember("key", "value", doc.GetAllocator()) ; //compiles
obj.AddMember("key", str, doc.GetAllocator()) ; // does not compile
obj.AddMember("key", str.c_str(), doc.GetAllocator()) ; // does not compile
<string>
?另外,main()
函数总是返回int
类型。 - Dietmar Kühlc_str()
返回一个指针。可以有函数重载来区分它们(但是让它们行为显着不同可能会很不友好)。 - Alan Stokesstring("value").c_str()
的生命周期非常有限。因此,除非进行const char*
的复制,否则可能会出现悬空指针。 - Jarod42