我已经读过,如果boost::variant
的所有变体都是可流式传输的,则#include <iostream>
#include <vector>
#include <string>
#include <boost/variant.hpp>
std::ostream& operator<<(std::ostream& out, const std::vector<int>& v) {
for(int i = 0; i < v.size(); ++i)
out << " " << v[i];
return out;
}
int main() {
boost::variant<int, std::string > a(3);
std::cout << a << '\n'; // OK
std::vector<int> b(3, 1);
std::cout << b << '\n'; // OK
boost::variant<int, std::vector<int> > c(3);
std::cout << c << '\n'; // ERROR
}
是可流式传输的。然而,
{{1}}
无法编译。为什么呢?
版本:
答案 0 :(得分:6)
我没有检查序列化的文档,但我很确定operator<<
的{{1}}类型需要通过Argument Dependent Lookup找到,或者存在于{boost::variant
中1}}名称空间。
boost
输出:
#include <iostream>
#include <vector>
#include <string>
#include <boost/serialization/variant.hpp>
namespace boost {
std::ostream& operator<<(std::ostream& out, const std::vector<int>& v) {
for(int i = 0; i < v.size(); ++i)
out << " " << v[i];
return out;
}
}
int main() {
boost::variant<int, std::string > a(3);
std::cout << a << '\n';
{
using namespace boost;
std::vector<int> b(3, 1);
std::cout << b << '\n';
}
boost::variant<int, std::vector<int> > c(3);
std::cout << c << '\n';
}