c++ - boost-variant的 vector

标签 c++ boost vector variant boost-variant

我尝试使用 boost::variant

std::vector<boost::variant<mesh::Entity&, mesh::Vertex, mesh::Edge> > 
    xField::getZeros(const mesh::Region& s, char *EntityS) const
{
//Vertex  
  if( EntityS == "V" )
  {
    std::vector<mesh::Vertex> zeros;
    for(Region::vertexIterator itv = s.beginVertex(); 
        itv != s.endVertex(); ++itv )
    {
      if( abs(getVal(*itv)) < 1.e-12 )      
      zeros.push_back(*itv);
    }
      return zeros;    
  }
 else if ..

但我收到错误:
错误:请求从“std::vector”转换为非标量类型“std::vector >”

编辑:
zeroVector xField::getZeros(const mesh::Region& s, char *EntityS) const
{
//Vertex  
  if( EntityS == "V" )
  {
    zeroVector zeros;
    for(Region::vertexIterator itv = s.beginVertex(); itv != s.endVertex(); ++itv )
    {
      if( abs(getVal(*itv)) < 1.e-12 )      
      zeros.push_back( zeroVariant(*itv) );
    }
      return zeros;

我在 .h 文件中定义了 typedef
typedef boost::variant<mesh::Entity&, mesh::Vertex, mesh::Edge> zeroVariant;
typedef std::vector<zeroVariant> zeroVector;

现在我有以下错误:

/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/detail/reference_content.hpp:在成员函数'void boost::detail::variant::assign_storage::internal_visit(T&, int) const [with T = boost::detail::reference_content]':
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/detail/visitation_impl.hpp:130:9:实例化自'typename Visitor::result_type boost::detail::variant:: visitation_impl_invoke_impl(int, Visitor&, VoidPtrCV, T*, mpl_::true_) [with Visitor = boost::detail::variant::assign_storage, VoidPtrCV = void*, T = boost::detail::reference_content, typename Visitor:: result_type = void, mpl_::true_ = mpl_::bool_]'
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/detail/visitation_impl.hpp:173:9:实例化自'typename Visitor::result_type boost::detail::variant:: visitation_impl_invoke(int, Visitor&, VoidPtrCV, T*, NoBackupFlag, int) [with Visitor = boost::detail::variant::assign_storage, VoidPtrCV = void*, T = boost::detail::reference_content, NoBackupFlag = boost::变体::has_fallback_type_, typename 访问者::result_type = void]'
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/detail/visitation_impl.hpp:260:1:实例化自'typename Visitor::result_type boost::detail::variant:: visitation_impl(int, int, Visitor&, VoidPtrCV, mpl_::false_, NoBackupFlag, which*, step0*) [with which = mpl_::int_<0>, step0 = boost::detail::variant::visitation_impl_step, boost: :detail::reference_content、boost::mpl::l_item、mesh::Vertex、boost::mpl::l_item、mesh::Edge、boost::mpl::l_end> > >、boost::mpl:: l_iter >, Visitor = boost::detail::variant::assign_storage, VoidPtrCV = void*, NoBackupFlag = boost::variant::has_fallback_type_, typename Visitor::result_type = void, mpl_::false_ = mpl_::bool_]'
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/variant.hpp:2326:13:从'静态类型名Visitor::result_type boost::variant::internal_apply_visitor_impl(int, int, Visitor&, VoidPtrCV) [与访客 = boost::detail::variant::assign_storage, VoidPtrCV = void*, T0_ = mesh::Entity&, T1 = mesh::Vertex, T2 = mesh::Edge, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_ , T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant: :void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail:: variant::void_, T19 = boost::detail::variant::void_, typename Visitor::result_type = void] ’
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/variant.hpp:2337:13:从'typename Visitor::result_type boost::variant::internal_apply_visitor(Visitor&) [访客 = boost::detail::variant::assign_storage, T0_ = mesh::Entity&, T1 = mesh::Vertex, T2 = mesh::Edge, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_,T9 = boost::detail::variant::void_,T10 = boost::detail::variant::void_,T11 = boost::detail::variant:: void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail: :variant::void_, typename 访问者::result_type = void]'
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/variant.hpp:2085:13:从'void boost::variant::variant_assign(const boost::variant&)实例化[ T0_ = 网格::实体&,T1 = 网格::顶点,T2 = 网格::边缘,T3 = boost::detail::variant::void_,T4 = boost::detail::variant::void_,T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_,T10 = boost::detail::variant::void_,T11 = boost::detail::variant::void_,T12 = boost::detail::variant:: void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, boost::variant = boost: :变体]'
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/variant.hpp:2175:9:从 'boost::variant& boost::variant::operator=(const boost: 实例化: :variant&) [T0_ = mesh::Entity&, T1 = mesh::Vertex, T2 = mesh::Edge, T3 = boost::detail::variant::void_, T4 = boost::detail::variant:: void_, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail: :variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost:: detail::variant::void_、T17 = boost::detail::variant::void_、T18 = boost::detail::variant::void_、T19 = boost::detail::variant::void_、boost::变体 = boost::variant]'
/usr/include/c++/4.5/bits/vector.tcc:312:4: 从 'void std::vector<_Tp, _Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator, const 实例化_Tp&) [与 _Tp = boost::variant, _Alloc = std::allocator >, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator*, std::vector > >,类型名 std::_Vector_base <_Tp, _Alloc>::_Tp_alloc_type::pointer = boost::variant*]'
/usr/include/c++/4.5/bits/STL_vector.h:749:4: 从 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = boost::variant, _Alloc = 实例化std::allocator >, value_type = boost::variant]'
/home/mycode.cc:128:42:从这里实例化
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/detail/reference_content.hpp:62:24: 错误:'boost::detail::reference_content& boost::detail::reference_content:: operator=(const boost::detail::reference_content&) [with RefT = mesh::Entity&, boost::detail::reference_content = boost::detail::reference_content]' 是私有(private)的
/softs/boost/1.53.0/64/gcc/4.5.1/include/boost/variant/variant.hpp:526:9: 错误:在此上下文中

提前致谢!!!!

最佳答案

您需要更改“零”的类型 - 它无法从 std::vector<mesh::Vertex> 转换到您的变体类型的 vector 。使用一些 typedef 也可以使代码不那么冗长:

typedef boost::variant<mesh::Entity&, mesh::Vertex, mesh::Edge> EvVariant;
typedef std::vector<EvVariant> EvVariantVector;

EvVariantVector xField::getZeros(const mesh::Region& s, char *EntityS) const
{
//Vertex  
  if( EntityS == "V" ) // This line is probably a bug!
  {
    EvVariantVector zeros; // Use the return type here!
    for(Region::vertexIterator itv = s.beginVertex(); itv != s.endVertex(); ++itv )
    {
      if( abs(getVal(*itv)) < 1.e-12 )      
      zeros.push_back(EvVariant(*itv));
    }
      return zeros;    
  }
 else if ..

也行if (EntityS == "V")不正确,可能会失败。使用 strcmp 或仅比较字符串的第一个字符。

关于c++ - boost-variant的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651996/

相关文章:

c++ - 如何在 C++ 中使用 boost::dynamic_bitset

c++ - 使用 boost 的 C++ 中的 TCP 和 UDP 客户端 + 服务器

c++ - C++ 中的引用和普通变量句柄有什么区别?

c++ - 标准如何处理容器插入函数中的自引用迭代器?

c++ - 元组和压缩对有什么区别?

c++ - 如何在不导致内存错误的情况下从 vector 中删除对象指针?

c++ - 从输入中创建最大可能的数字 - cout 的实现问题

vector::push_back() 中的 C++ 奇怪行为

c++ - 如何使用 WinDbg 查找 `GetProcAddress` 函数的过程名称

c++ - OpenCV 抓图 : how to combine GC_INIT_WITH_RECT and GC_INIT_WITH_MASK