使用for_Each算法时无效使用void表达式错误

时间:2011-11-20 18:02:53

标签: c++ foreach

我的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 个答案:

答案 0 :(得分:4)

for_each(c.begin(),c.end(),draw_all_seq_inside(c, w));

第三个参数应该是一个可调用的实体。也就是说,它可以是一个函数对象或函数指针,它可以接受容器c元素类型的一个参数。

但是在你的代码中,你正在调用函数并将返回的值(void)作为第三个参数传递给std::for_each。这是错误的原因。

答案 1 :(得分:0)

你做不到。

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之外。