2014-01-03 3 views
0

Я читал, что 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,53
  • GCC 4.6.3
+3

DONT делают нас GUESS. Отправьте сообщение об ошибке ТАКЖЕ! ... – Nawaz

ответ

6

Я не проверила документацию сериализации, но я уверен, что operator<< для типов boost::variant должен быть найден либо в зависимости от зависимостей Аргумента, либо присутствовать в пространстве имен boost.

This works:

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

Выход:

3 
1 1 1 
3 
+0

Все еще запутано. Почему мой «оператор <<» не найден через поиск Koenig? (Строго говоря, мой вопрос был «почему»). Определение функций в 'boost' для объектов, которые не из Boost, похоже на плохую практику. – MaxB

+1

@MaxB потому что зависящий от аргумента поиск выглядит в связанных пространствах имен, будучи ':: std' (из std :: vector и/или std :: ostream), только – sehe

Смежные вопросы