为什么这个boost :: variant缺少运算符&lt; <! - ? - >

时间:2014-01-03 13:03:51

标签: c++ boost boost-variant

我已经读过,如果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}}

无法编译。为什么呢?

版本:

  • 提升1.53
  • GCC 4.6.3

1 个答案:

答案 0 :(得分:6)

我没有检查序列化的文档,但我很确定operator<<的{​​{1}}类型需要通过Argument Dependent Lookup找到,或者存在于{boost::variant中1}}名称空间。

This works

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';
}