Проблема с комбинацией boost :: exception и boost :: option - PullRequest
0 голосов
/ 13 марта 2011

У меня странная проблема с двухуровневой структурой вариантов, когда добавлено повышение :: исключение.У меня есть следующий фрагмент кода:

#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>

Спасибо и всего наилучшего

Рик

1 Ответ

0 голосов
/ 13 марта 2011

Я не думаю, что это имеет какое-либо отношение к boost :: exception. Это выходной поток «оператор <<». Но я не использовал вариант, поскольку вы используете его - только один тип; Я думал, что у вас должно быть как минимум 2 типа, так как это «союз на стероидах», но, может быть, есть что-то неявное ... Я вернусь к документации. </p>

Ваш код находится внутри пространства имен boost? Я думаю, что ваши операторы потока вывода конфликтуют с определенным для исключения. Попробуйте поместить свой код в собственное пространство имен.

Что касается оператора, который не выполняется, может возникнуть проблема выбора неправильного оператора ... попробуйте использовать свой оператор "<<", добавив к нему префикс пространства имен и оператора разрешения, как вы делаете с <em>станд :: stringstream.

РЕДАКТИРОВАТЬ: В продолжение вашего последнего комментария: вы можете определить свои операторы в ваших собственных пространствах имен, скажем, mynamespace , а затем использовать ваши версии явно при необходимости, например,

void TestVariant()
{
  using namespace mynamespace;

  ExpressionItem test;
  std::stringstream str;
  str << test;
}

Это будет работать с вышеупомянутым примером, но я не уверен, что это так, с какой именно ситуацией вы сталкиваетесь ... и я не очень знаком с spirit

...