Трудно е да сте сигурни, без да видите контекста на сегмента, който сте публикували, но изглежда, че проблемът, с който се сблъсквате, е с изходния тип на << оператор на конструктора на поток. Създателят на поток всъщност е погрешно именуван; това не е "поток" в типичния C++ смисъл на думата, като изходен тип на << понякога ще бъде различен от левия операнд. По-специално, когато използвате нещо като open_document или close_document , типът, който извежда изразът, ще бъде различен от това, което е операндът от лявата страна. Поради това обикновено ще трябва да съхраните изхода на един от тези изрази.
Поради объркването, което конструкторът на потоци често причинява в случаи като този, обикновено е за предпочитане вместо това да използвате основния конструктор. Въпреки че основният синтаксис на компилатора е малко по-подробен, е много по-трудно да направите фина грешка с него, а когато направите грешка, съобщенията за грешка на компилатора са много по-лесни за разбиране.
Ето как бихте изградили същия документ с основния конструктор:
#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/builder/basic/kvp.hpp>
#include <bsoncxx/builder/basic/sub_document.hpp>
using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::sub_document;
bsoncxx::builder::basic::document doc;
// Build the document
doc.append(kvp("MainType", [](sub_document sub_doc1) {
sub_doc1.append(kvp("TLSRecord", [](sub_document sub_doc2) {
sub_doc2.append(kvp("type", "16"),
kvp("version", "0301"),
kvp("length", "012C"),
kvp("hsMsg", [](sub_document sub_doc3) {
sub_doc3.append(kvp("type", "01"),
kvp("length", "000128"),
kvp("clientHello", [](sub_document sub_doc4) {
sub_doc4.append(
kvp("version", "0303"),
kvp("random", "40C70E243001B96D8C"),
kvp("session_id_length", ""));
}));
}));
}));
}));
// Get a view of the document being built and do something with it.
do_something_with_document_view(doc.view());
// Extract the document from the builder and do something with it.
do_something_with_owned_document(doc.extract());
bsoncxx::builder::basic::document::append взема произволен брой kvp (двойки ключ-стойност) и ги добавя към създателя. За основни типове като низове, можете просто да подадете стойността като втори аргумент. За да създадете поддокумент, използвайте ламбда като втори аргумент, който приема bsoncxx::builder::basic::sub_document и след това добавете към този конструктор на поддокумент по същия начин.
За да получите документа от създателя, можете да използвате view() или extract() методи. view() връща bsoncxx::document::view() , което е непритежаван изглед на документа; строителят трябва да остане жив през цялото време, докато се използва изгледът. extract() връща bsoncxx::document::value, която е притежавана стойност; когато extract() се извиква, създателят се нулира обратно в празно състояние.