Синтаксис для использования std :: binary_function - PullRequest
0 голосов
/ 29 июня 2010

Я новичок в использовании алгоритмов STL и в настоящее время застрял на синтаксической ошибке. Моя общая цель этого состоит в том, чтобы отфильтровать список источников, как вы бы использовали Linq в c #. В C ++ могут быть другие способы сделать это, но мне нужно понять, как использовать алгоритмы.

Мой пользовательский функциональный объект для использования в качестве моего функционального адаптера:

struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool>
{
bool operator()(SOURCE_DATA * test,  SOURCE_TYPE ref)const
    {
    if (ref == SOURCE_All)
        return true;
    return test->Value == ref;
    }
};

И в моей основной программе я использую следующее -

typedef std::list<SOURCE_DATA *> LIST;
LIST; *localList = new LIST;;
LIST* msg = GLOBAL_DATA->MessageList;
SOURCE_TYPE _filter_Msgs_Source = SOURCE_TYPE::SOURCE_All;

std::remove_copy(msg->begin(), msg->end(), localList->begin(),
    std::bind1st(is_Selected_Source<SOURCE_DATA*, SOURCE_TYPE>(), _filter_Msgs_Source));

Что я получаю в Rad Studio 2010. Следующая ошибка: «В исходном файле используется символ typedef, где переменная должна появляться в выражении».

"E2108 Неправильное использование typedef 'is_Selected_Source'"


Редактировать - Проведя больше экспериментов в VS2010, который имеет лучшую диагностику компилятора, я обнаружил, что проблема в том, что определение remove_copy допускает только унитарные функции. Я изменил функцию на униарную и заставил ее работать.

Ответы [ 2 ]

0 голосов
/ 29 июня 2010

При предположении (хотя это только предположение) проблема в том, что std::remove_copy ожидает значение , но вы предоставляете предикат.Чтобы использовать предикат, вы должны использовать std::remove_copy_if (и тогда вы захотите прислушаться к ответу @ Cogwheel).

Я бы также отметил, что:

LIST; *localList = new LIST;;

выглядит неправильно- Я полагаю, вы намеревались:

LIST *locallist = new LIST;

вместо.

0 голосов
/ 29 июня 2010

(Это актуально только в том случае, если вы случайно не пропустили часть своего кода в вопросе и не можете точно решить возникшую проблему)

Вы используете is_Selected_Source в качестве шаблона, даже если вы не определили его как один. Последняя строка во втором фрагменте кода должна читаться как std::bind1st(is_Selected_Source() ...

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

template<typename SOURCE_DATA, typename SOURCE_TYPE>
struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool>
{
    // ...
};
...