Проблема с boost :: bind, boost :: function и boost :: factory - PullRequest
3 голосов
/ 16 марта 2011

Я безуспешно пытаюсь использовать boost :: bind with boost :: factory

У меня есть этот класс Zambas с 4 аргументами (2 строки и 2 числа) и

class Zambas {

public:

Zambas(const std::string&, const std::string&,int z1=0,int z2=0) {    
      if (z1==z2){

      }
    }
};

внутри другого метода у меня есть следующий вызов

boost::function<Zambas*()> f(boost::bind(boost::factory<Zambas*>(), std::string(""), std::string(""),_1,_2));

, который завершается с ошибкой следующего компилятора:

bind.hpp:382: error: no match for ‘operator[]’ in ‘a[boost::_bi::storage3<A1, A2, boost::arg<I> >::a3_ [with A1 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A2 = boost::_bi::value<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, int I = 1]]’

Что я делаю неправильно?

1 Ответ

1 голос
/ 17 марта 2011

Функция bind возвращает функтор с двумя аргументами, поскольку вы связали третий и четвертый параметры вашего конструктора со значениями-заполнителями _1 и _2.Тем не менее, вы сохраняете результат в объекте function с нулевым аргументом.

Я нашел ссылку от шести лет назад , объясняющую, что вы не можете опустить параметры при привязкефункция, , даже если они объявлены со значениями по умолчанию .

Я думаю, у вас есть три варианта:

  1. Предоставить фактические int значения в вашем вызовеbind вместо заполнителей.
  2. Измените объявление f, чтобы указать, что оно хранит функцию с двумя аргументами, а затем всегда предоставляете оба значения при вызове.
  3. Привязатьпоследние два параметра переменные .См. Задержка констант и переменных в документации Boost.Lambda.Затем вы можете установить для этих переменных те же значения по умолчанию, что и для конструктора.Чтобы использовать значения по умолчанию, больше ничего не делайте.Чтобы указать значения, отличные от значений по умолчанию, присвойте значения этим переменным перед вызовом f.

Последний вариант, вероятно, просто затруднит чтение вашего кода без особой пользы, поэтому предпочтите один из первых двухварианты вместо.

...