icpc错误隐式生成赋值运算符无法复制引用成员(boost图)

时间:2014-06-25 21:04:48

标签: c++ c++11 boost-graph icc

我使用boost::filter_iterator来过滤一对增强图顶点,如下所示:

我使用vertex_iterator<vbegin, vend>.有一系列图顶点 我想使用谓词过滤范围,并且需要对范围进行分组 说4个子范围

<begin1, end1> ... <begin4, end4>

所以我使用boost::filter_iterator过滤顶点迭代器并创建4个子范围。 这种子范围迭代器对需要插入容器(矢量)

std::vector< pair<filter_iterator, filter_iterator> >  my_vector
size of vector = 4 (because 4 pairs are inserted)

具有给定所需参数的过滤谓词有助于定义过滤器迭代器范围

<fbegin, fend>

代码如下:

 template<typename Graph> 
 struct my_filter_pred {
   public:
     my_filter_pred() { }  
     my_filter_pred(Graph& _G, int _value) : G(_G), value(_value) {  } 

     template<typename vertex_t>
     bool operator() (vertex_t vertex) {

        //get property "p" of vertex in graph G
        auto p = get (mypropertytype, vertex, G);
        return (p.val == value); 
     }

     private: 
      Graph& G;
    }

  //get all vertices using vertex iterator
  vertex_iterator  vbegin, vend;
  boost::tie(vbegin, vend) = boost::vertices(G); 

for循环如下“

  //for each i = 0,1,2,3 -> create a predicate with i as parameter.
  //apply the filter predicate over the vertex_iterator range
  //insert in the begin, end pair into vector

  for (int i=0; i<4; ++i) 
  {
    //for each i, create a filter_pred 
    my_filter_pred <Graph> filter_pred(G, i)

    //now create begin and end filter iterators as follows
    auto fbegin = boost::make_filter_iterator< my_filter_pred<Graph>,
                                       vertex_iterator>   (filter_pred, vbegin, vend)
    auto fend = boost::make_filter_iterator< my_filter_pred<Graph>,
                                       vertex_iterator>   (filter_pred, vend, vend)

    //fbegin, fend are of type filter iterator
    //insert the iterator pair into vector
    my_vector.push_back( std::make_pair (fbegin, fend) );
   }

现在:问题测试部分:

我正在使用2个编译器gcc4.9和Inter 13.0.1来测试此代码。

结果:

gcc 4.9 --> works correctly, compiles fine and works fine as well. 
icpc gives me the following error:

   error: implicitly generated assignment operator cannot copy:
        reference member "my_filter_pred <Graph>::G [with ... ]"

struct my_filter_pred {          ^           检测期间:

我用Google搜索了错误,我在intel的网站here上找到了这个链接 关于相同的错误,但没有提供此类错误的信息。

我该如何解决这个问题?我尝试将以下内容添加到我的谓词(函数对象)

   my_filter_pred& operator=(const my_filter_pred&);
   my_filter_pred(const my_filter_pred&);

但之后我得到了“未定义的引用....”错误。如何显式定义复制赋值运算符和复制构造函数

1 个答案:

答案 0 :(得分:1)

由于您在谓词Graph& G中使用引用my_filter_pred,后者是可复制构建的,但不能由operator =分配。但是你需要在code.gnable的许多地方使用operator =。

我建议更改代码如下

模板  struct my_filter_pred {    上市:      my_filter_pred(){}
     my_filter_pred(Graph&amp; _G,int _value):G(&amp; _G),value(_value){}

 template<typename vertex_t>
 bool operator() (vertex_t vertex) {

    //get property "p" of vertex in graph G
    auto p = get (mypropertytype, vertex, *G);
    return (p.val == value); 
 }

 private: 
  Graph* G;
}

现在过滤谓词是可复制的。