boost :: любой тестовый код компилируется с Sun CC, но не с g ++ - PullRequest
1 голос
/ 02 декабря 2009

следующий код проверки noddy:

#include <iostream>
#include <list>
#include <boost/any.hpp>
#include <boost/foreach.hpp>
#include <typeinfo.h>

using boost::any_cast;
using std::cout;
using std::cerr;
typedef std::list<boost::any> many;

template <typename T>
inline bool is_any(const boost::any& op)
{
  return (op.type() == typeid(T));
}

int main()
{
  many theStrangeList;
  theStrangeList.push_back("Can you really...");
  theStrangeList.push_back(std::string ("do random types in 1 container?"));
  theStrangeList.push_back(6.359);
  theStrangeList.push_back(7);

  BOOST_FOREACH(boost::any a, theStrangeList)
    {
      try
        {
          if (is_any<const char*>(a))
            {
              cout << any_cast<const char*>(a) << '\n';
            }
          else if (is_any<std::string>(a))
            {
              cout << any_cast<std::string>(a) << '\n';
            }
          else if (is_any<double>(a))
            {
              cout << "double = " << any_cast<double>(a) << '\n';
            }

        }
      catch (const boost::bad_any_cast& e)
        {
          cerr << e.what();
          cerr << "\n";
        }
    }


  return 0;
}

Компилируется и работает нормально, используя компилятор Sun CC и настройки по умолчанию. Однако при использовании g ++ я получаю следующее:

$ g++ -I$BOOST_ROOT -o myany myany.cpp
myany.cpp:5:22: typeinfo.h: No such file or directory
/ilx/boost_1_41_0/boost/any.hpp: In constructor `boost::any::holder<ValueType>::holder(const ValueType&) [with ValueType = char[18]]':
/ilx/boost_1_41_0/boost/any.hpp:47:   instantiated from `boost::any::any(const ValueType&) [with ValueType = char[18]]'
myany.cpp:21:   instantiated from here
/ilx/boost_1_41_0/boost/any.hpp:122: error: ISO C++ forbids assignment of arrays

Это g ++ версии 3.4.3, поэтому она может отличаться в версии 4.x, я попробую позже. Это причина, по которой нет шаблона is_any, включенного в boost any, или это ошибка компилятора?

Если я удалю шаблон, я получу тот же результат, что и при использовании встроенной функции.

(связанный вопрос)

Ответы [ 2 ]

3 голосов
/ 02 декабря 2009

Для первой ошибки попробуйте

#include <typeinfo>

не

#include <typeinfo.h>
2 голосов
/ 02 декабря 2009

Кажется, я только ответил на вторую часть вопроса, так что здесь я перехожу и к первой части:

Это причина, по которой шаблон 'is_any' не включен с boost?

Нет необходимости в is_any, вместо этого сделайте следующее:

if (const std::string* s = boost::any_cast<std::string>(&a))
{
   std::cout << "string = " << *s << '\n';
}
else if (const double* d = boost::any_cast<double>(&a))
{
   std::cout << "double = " << *d << '\n';
}

Но это не расширяемо, предпочтительнее использовать boost::variant.

Это ошибка компилятора?

Это ошибка компилятора в Sun CC. gcc верен, тип "Can you really..." равен char[18], что не удовлетворяет требованиям boost :: any:

  • ValueType является CopyConstructible.
  • Параметр ValueType может быть назначен по выбору. Для всех форм назначения требуется строгая гарантия исключительной безопасности.
  • Деструктор для ValueType поддерживает гарантию безопасности исключений без бросков.
...