boost ::任何测试代码都使用Sun CC编译,但不能编译g ++

时间:2009-12-02 12:03:15

标签: c++ compiler-construction boost g++ sun

以下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版本上可能会有所不同,我稍后会尝试。这是为什么boost any中没有包含'is_any'模板的原因,还是编译器错误?

如果删除模板,我会得到相同的结果,正如您对内联函数所期望的那样。

(related question)

2 个答案:

答案 0 :(得分:3)

对于第一个错误,请尝试

#include <typeinfo>

#include <typeinfo.h>

答案 1 :(得分:2)

似乎我只回答了问题的第二部分,所以我在这里也谈到第一部分:

这就是为什么boost any中没有'is_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的析构函数支持无抛出异常安全保证。