У меня странная проблема с двухуровневой структурой вариантов, когда добавлено повышение :: исключение.У меня есть следующий фрагмент кода:
#include <boost/variant.hpp>
#include <boost/exception/all.hpp>
typedef boost::variant< int > StoredValue;
typedef boost::variant< StoredValue > ExpressionItem;
inline std::ostream& operator << ( std::ostream & os, const StoredValue& stvalue ) { return os;}
inline std::ostream& operator << ( std::ostream & os, const ExpressionItem& stvalue ) { return os; }
Когда я пытаюсь его скомпилировать, возникает следующая ошибка:
boost/exception/detail/is_output_streamable.hpp(45): error C2593: 'operator <<' is ambiguous
test.cpp(11): could be 'std::ostream &operator <<(std::ostream &,const ExpressionItem &)' [found using argument-dependent lookup]
test.cpp(8): or 'std::ostream &operator <<(std::ostream &,const StoredValue &)' [found using argument-dependent lookup]
1> while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, const boost::error_info<Tag,T>)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> and
1> [
1> Tag=boost::tag_original_exception_type,
1> T=const type_info *
1> ]
Фрагмент кода максимально упрощен, в реальном кодеструктуры намного сложнее, и каждый вариант имеет пять подтипов.
Когда я удаляю #include boost / exception / all и пытаюсь выполнить следующий тестовый фрагмент, программа компилируется правильно:
void TestVariant()
{
ExpressionItem test;
std::stringstream str;
str << test;
}
Couldкто-то, пожалуйста, посоветуйте мне, как определить операторы << для того, чтобы функционировать даже при использовании boost :: Exception? </p>
Спасибо и всего наилучшего
Рик