boost:: любой тестовый код компилируется с Sun CC, но не с g++
Следующий тестовый код 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 ответа
Кажется, я только ответил на вторую часть вопроса, так что здесь я перехожу и к первой части:
Это причина, по которой нет шаблона is_any, включенного в boost any?
Там нет фактической необходимости 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 поддерживает гарантию безопасности исключения исключений.
Для первой ошибки попробуйте
#include <typeinfo>
не
#include <typeinfo.h>