Старая проблема на bind1st с men_fun в C ++ STL - PullRequest
1 голос
/ 07 февраля 2012

Некоторый простой код продемонстрирует проблему:

class Foo {};
struct Bar {
    bool foo(const Foo &f) const { return false; }
};

int main() {
    Bar bar;

    vector<Foo> v;

    std::find_if(v.begin(), v.end(), std::bind1st(
        std::mem_fun_ref(&Bar::foo), bar));

    return 0;
}

Теперь для этого кода компилятор VS2010 c ++ будет жаловаться: ошибка C2535: bool std :: binder1st <_Fn2> :: operator () (const Foo &) const: функция-член уже определена из объявленного

В более ранних версиях Visual Studio возможны еще две ошибки компиляции, связанные со ссылками на проблемы со ссылками. Хотя эти проблемы исчезли в VS2010, C2535 остается.

Этот вопрос похож на этот . Как предполагается в этом посте, я могу использовать std :: bind или библиотеку boost в качестве альтернативы. Они работают нормально, но сейчас я хотел бы знать, возможно ли использовать старый стиль bind1st в этом случае, или эта проблема является скорее дефектом, присущим функциональной структуре STL? Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Это не проблема VS или какого-либо компилятора.Тип, возвращаемый mem_fun_ref, равен mem_fun_ref_t, который наследуется от унарной функции.Этот функтор принимает один аргумент, который должен иметь тип класса, к которому принадлежит функция-член.mem_fun_ref не может работать для функций-членов, которые принимают аргументы.

Связыватели устарели по причине: они отстой.

0 голосов
/ 07 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...