2017-02-24 88 views
0

我正在嘗試使用v3驅動程序生成mongodb文檔。我使用「char *」指針數組中的字符串,但是我一直收到一個錯誤,說明運算符不明確。確切的錯誤是:在Mongodb C++驅動程序文檔生成器中模糊<<運算符

item.cpp:105: error: ambiguous overload for ‘operator<<’ (operand types are

‘std::enable_if<true, bsoncxx::v_noabi::builder::stream::key_context<> >::type {aka bsoncxx::v_noabi::builder::stream::key_context<>}’ and ‘const char*’) 
     << dbTypeString[dbType::IT_TYPE] 

dbTypeString就像是一個字符串數組:

const char * dbTypeString[] = {"string a", "string b"} 

蒙戈代碼的簡化版本,看起來像

bsoncxx::builder::stream::document doc{}; 

doc << dbTypeString[0] << "value string"; 

奇怪的是即:doc < <「string1」< <「string2」起作用精細。

有什麼建議嗎?

回答

0

這裏的錯誤信息可能有點難以解析,但重要的部分是ambiguous overload for ‘operator<<’bsoncxx::v_noabi::builder::stream::key_context<><<運算符對類bsoncxx::builder::stream::key_context(內部是處理文檔生成器的附加操作)的類進行重載,編譯器不知道要使用哪個定義,因爲有多個可以工作。更具體地說,operator<<沒有定義接受const char *爭論,但是有定義接受std::stringstdx::string_view,並且const char *可以被強制爲這些類型之一。

要獲得編譯代碼,您有幾個選項。首先,你可以改變dbTypeString包含std::string而不是const char *

std::string dbTypeString[] = {"string a", "string b"} 

另外,如果你的數組,而保持其當前的類型,你可以手動施放const char *std::string,從而消除的不確定性其中超載撥打:

doc << static_cast<std::string>(dbTypeString[0]) << "value string"; 

在一個稍微切筆記,一般流構造器可能會非常棘手使用(尤其是關於返回類型的<<運營商,這已經引起了混亂的公平量Ť他過去了)。如果可能,我個人建議使用basic builder;雖然API的人體工程學稍差,但它不會受到流構建器所做的相同複雜性的影響,這意味着在(更罕見)的情況下,如果使用不當,會導致錯誤,因此可能會調試問題更直接。