我想這個代碼中的最後兩行應該編譯。每當預期字符串文字時,可以使用std :: string :: c_str()嗎?
#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
方法有幾個變種,如文檔here,但除此之外......爲什麼.c_str()
的返回不等於字符串文字?
我的理解是,凡是字符串文字被接受的地方,你可以通過string::c_str()
,它應該工作。
PS:我用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<>
]
EDIT2:
請忽略的事實是.c_str()
被稱爲一個時間值。這個例子只是爲了顯示編譯錯誤。實際的代碼使用一個字符串變量。
EDIT3:
代碼的替代版本:
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
您是否包含''?而且,'main()'總是返回'int'。 –
字符串文字具有數組類型,而'c_str()'返回一個指針。有可能會有功能超載,可以說明差異(但相當不友好,使他們的行爲顯着不同)。 –
'string(「value」).c_str()'的生存期非常有限。所以除非'const char *'的副本完成,否則你可能有懸掛指針。 – Jarod42