ошибка компилятора intel: нет экземпляра перегруженной функции boost::put()

#c #c 11 #boost #boost-graph #icc

# #c #c 11 #boost #boost-график #icc

Вопрос:

Я использую компилятор Intel 13.0.1, и с boost 1.52 я получаю следующую ошибку, когда я использую boost::get() и boost::put()

Я использую a boost::adjacency_list<> для своего типа графика. Свойства присваиваются вершинам. Функции get() и put() помогают извлекать свойства с помощью boost::property_map <> интерфейса. Я использую пользовательские свойства, поэтому я определяю свою собственную структуру для хранения свойств и соответствующий тег для свойства

 //G --> my graph_t  type
//vd --> vertex
//p --> property fetched from the graph object for vertex vd (used auto c  11) 
//

auto p = boost::get(PropertyTag(), G, vd); //fetch the property using put.
modify p (do anything)
boost::put(PropertyTag(), G, vd, p)  // update the property using put
 

Когда я компилирую это с помощью компилятора Intel, я получаю следующую ошибку:

 error: no instance of overloaded function "boost::put" matches the argument list
        argument types are: (PropertyTag, Graph_t, const size_t, NodeInfo)
   boost::put(PropertyTag(), G, vd, p);
   ^
      detected during:
        instantiation of ...
 

Обратите внимание , что ошибка возникает только для boost::put() , а не для boost::get() .

Они get() и put() находятся внутри функции , скажем modify_properties() . Эта функция используется как объект функции, скажем, m y_functor(...) . Я использую boost::bind() для функтора, и функция используется внутри него.

  template <typename graph_t>
 struct my_functor {
  public: 
    my_functor() {  } 
    my_functor(graph_tamp; G_) : G(G_) {  } 

    template<typename vertex>
    void operator()(vertex vd) {
      modify_properties(vd);
     }  
   private:
    graph_tamp; G;
  }

 auto f = boost::bind(my_functor<graph_t>(G), _1)  //placeholder is for vertex_descriptor

 //call the "f" on vertex
 f (vd)  //goes to functor with vd as placeholder, then calls modify_property(vd), this calls boost::get() and boost::put()..
 

Имеет ли это какое-либо отношение к развертыванию функции с использованием boost::bind ? Я знаю intel 13.0 , что версия плохо справляется std::bind (C 11) . поэтому я использую boost bind . Или boost::bind не позволяет изменять какую-либо вещь (постоянство), потому boost::get() что работает нормально. boost::put() Это проблема

Комментарии:

1. Если я разворачиваю функцию: modify_properties(vd) в функторе my_func(), я не получаю ошибку. Я предполагаю, что это из-за boost::bind, но я не знаю, как это исправить.

2. привязка не задействована. Можете ли вы просто создать SSCCE ? По всей вероятности, вы ответите на свой собственный вопрос , и в противном случае ваше описание проблемы станет осязаемым (в отличие от беспорядка неточных описаний, которые вы опубликовали. Извините за прямоту). Мне кажется, вам нужно только увеличить PropertyMap, чтобы продемонстрировать проблему. Держу пари, это можно было бы сделать в 5 строках кода