Неправильное использование ошибки void expression при использовании алгоритма for_Each - PullRequest
1 голос
/ 20 ноября 2011

Я получаю error: invalid use of void expression ошибку в моем draw_all_seq_inside2 методе!

template <typename Container>
void draw_all_seq_inside(Container &c, const rectangle &w){
    typename Container::iterator iter;
    for(iter = c.begin() ; iter != c.end() ; iter++){
            (*iter)->inside_window(w._btm_left, w._top_right);
    }
}

template <typename Container>
void draw_all_seq_inside2(Container &c, const rectangle &w){
    for_each(c.begin(),c.end(),draw_all_seq_inside(c, w));
}

Я звоню draw_all_seq_inside в for_each algorthim, я делаю это правильно?

Ответы [ 2 ]

4 голосов
/ 20 ноября 2011
for_each(c.begin(),c.end(),draw_all_seq_inside(c, w));

Третий аргумент должен быть вызываемой сущностью.То есть это может быть объект функции или указатель на функцию, который может принимать один аргумент типа элемента контейнера c.

Но в вашем коде вы вызываете функцию и передаете возвращенныйзначение (равное void) в качестве третьего аргумента для std::for_each.Это является причиной ошибки.

0 голосов
/ 20 ноября 2011

Вы не можете сделать это.

Третий параметр for_each - это функциональный объект, который принимает один параметр.for_each будет выполнять итерацию последовательности, указанной в первом и втором параметрах, и передавать значение каждого элемента этому функциональному объекту.

for_each полезно, когда его использование менее многословно, чем записьfor петля.Не похоже, что это так, но если вы действительно хотите использовать for_each, у вас есть только один вариант.

Написать класс:

template <typename Container>
void draw_all_seq_inside2(Container &c, const rectangle &w) {

    class Func
    {
        const rectangle & _w;
    public:
        Func(const rectangle &w) : _w(w) {}

        void operator()(/* type here */ * val)
        {
            val->inside_window(_w._btm_left, _w._top_right);
        }
    };
    for_each(c.begin(),c.end(), Func(w));
}

Этот код работает только для компилятора, совместимого с C ++ 11.Если вы используете реализацию C ++ 03, переместите определение класса за пределы draw_all_seq_inside2.

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