[sigc] Accumulators



I'm using libsigc++ 2.0.16 on Gentoo Linux, and trying to write an
accumulator for the first time, one that takes slots that return int and
returns a std::vector<int>.  Unfortunately, I get a compile error - it
seems that the iterators passed to the accumulator are picking-up on the
accumulator result_type, instead of the slot result_type, leading to
errors.  Does anyone have an example of an accumulator whose result type
differs from the slot result_type?

Thanks in advance,
Tim Shead

#include <sigc++/signal.h>
#include <vector>

class accumulate
{
public:
        typedef std::vector<int> result_type;

        template<typename IteratorT>
        result_type operator()(IteratorT First, IteratorT Last)
        {
                result_type result;

                for(; First != Last; ++First)
                        result.push_back(*First);

                return result;
        }
};

int foo()
{
        return 1;
}

int bar()
{
        return 2;
}

int main(int argc, char* argv[])
{
        sigc::signal0<int, accumulate> signal;

        signal.connect(sigc::ptr_fun(foo));
        signal.connect(sigc::ptr_fun(bar));

        std::vector<int> results = signal.emit();

        return 0;
}

$ gcc -o test test.cpp -I/usr/include/sigc++-2.0 -I/usr/lib/sigc
++-2.0/include -lstdc++ -lsigc-2.0
test.cpp: In member function `std::vector<int, std::allocator<int> > 
   accumulate::operator()(IteratorT, IteratorT) [with IteratorT = 
   sigc::internal::slot_iterator_buf<sigc::internal::signal_emit0<int, 
   accumulate>, std::vector<int, std::allocator<int> > >]':
/usr/include/sigc++-2.0/sigc++/signal.h:453:   instantiated from `static
typename T_accumulator::result_type
sigc::internal::signal_emit0<T_return,
T_accumulator>::emit(sigc::internal::signal_impl*) [with T_return = int,
T_accumulator = accumulate]'
/usr/include/sigc++-2.0/sigc++/signal.h:1702:   instantiated from
`typename sigc::internal::signal_emit0<T_return,
T_accumulator>::result_type sigc::signal0<T_return,
T_accumulator>::emit() const [with T_return = int, T_accumulator =
accumulate]'
test.cpp:38:   instantiated from here
test.cpp:25: error: no matching function for call to `std::vector<int, 
   std::allocator<int> >::push_back(std::vector<int, std::allocator<int>
>)'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/include/g
++-v3/bits/stl_vector.h:596: error: candidates
   are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp =
int, 
   _Alloc = std::allocator<int>]
/usr/include/sigc++-2.0/sigc++/signal.h: In member function `T_result 
   sigc::internal::slot_iterator_buf<T_emitter, T_result>::operator*()
const 
   [with T_emitter = sigc::internal::signal_emit0<int, accumulate>,
T_result = 
   std::vector<int, std::allocator<int> >]':
test.cpp:25:   instantiated from `std::vector<int, std::allocator<int> >
accumulate::operator()(IteratorT, IteratorT) [with IteratorT =
sigc::internal::slot_iterator_buf<sigc::internal::signal_emit0<int,
accumulate>, std::vector<int, std::allocator<int> > >]'
/usr/include/sigc++-2.0/sigc++/signal.h:453:   instantiated from `static
typename T_accumulator::result_type
sigc::internal::signal_emit0<T_return,
T_accumulator>::emit(sigc::internal::signal_impl*) [with T_return = int,
T_accumulator = accumulate]'
/usr/include/sigc++-2.0/sigc++/signal.h:1702:   instantiated from
`typename sigc::internal::signal_emit0<T_return,
T_accumulator>::result_type sigc::signal0<T_return,
T_accumulator>::emit() const [with T_return = int, T_accumulator =
accumulate]'
test.cpp:38:   instantiated from here
/usr/include/sigc++-2.0/sigc++/signal.h:296: error: no match for
'operator=' in 

'this->sigc::internal::slot_iterator_buf<sigc::internal::signal_emit0<int, 
   accumulate>, std::vector<int, std::allocator<int> > >::r_ = 

this->sigc::internal::slot_iterator_buf<sigc::internal::signal_emit0<int, 
   accumulate>, std::vector<int, std::allocator<int> > 
   >::c_->sigc::internal::signal_emit0<T_return,
T_accumulator>::operator() 
   [with T_return = int, T_accumulator = 
   accumulate]((+(&this->std::_List_iterator<_Tp, _Ref, _Ptr>::operator*
[with 
   _Tp = sigc::slot_base, _Ref = const sigc::slot_base&, _Ptr = const 
   sigc::slot_base*]())))'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/include/g
++-v3/bits/vector.tcc:128: error: candidates
   are: std::vector<_Tp, _Alloc>& std::vector<_Tp,
_Alloc>::operator=(const 
   std::vector<_Tp, _Alloc>&) [with _Tp = int, _Alloc =
std::allocator<int>]
distcc[12622] ERROR: compile test.cpp on localhost failed




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]