Boost logo

Boost Users :

Subject: [Boost-users] [Statechart] Passing reference to create_processor()
From: Hawkes Steve-FSH016 (Steve.Hawkes_at_[hidden])
Date: 2009-04-09 13:34:09


The Boost reference states that boost::ref can be used to pass an
argument
to statechart::fifo_scheduler::create_processor by reference instead of
by
value. I haven't been able to get this to work if the argument type
derives
from boost::noncopyable.
 
It appears that the create_processor implementation instantiates code
that
attempts to copy the argument.

Here's an example. Note that this compiles and runs sucessfully if
Object
does not derive from boost::noncopyable.

Thanks,
Steve Hawkes

----
#include <boost/statechart/asynchronous_state_machine.hpp>
#include <boost/statechart/fifo_scheduler.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/noncopyable.hpp>
#include <boost/ref.hpp>
#include <iostream>
class Object : public boost::noncopyable
{
};
struct Initial;
struct Test :
    boost::statechart::asynchronous_state_machine<Test, Initial>
{
  public:
    Test(my_context ctx, Object& arg1)
	: my_base(ctx)
    {
    }
};
struct Initial : boost::statechart::simple_state<Initial, Test>
{
};
int
main()
{
    Object	value;
    boost::statechart::fifo_scheduler<> scheduler;
    const boost::statechart::fifo_scheduler<>::processor_handle
processor1 =
	scheduler.create_processor
	<Test, Object&>
	(boost::ref(value));
    return (0);
}
----
Here's the compiler error:
----
g++ -Wall -lboost_system-mt -lboost_thread-mt -o test test.cc
/usr/include/boost/noncopyable.hpp: In copy constructor
'Object::Object(const Object&)':
test.cc:9:   instantiated from 'typename
boost::statechart::processor_container<boost::statechart::fifo_scheduler
<FifoWorker, Allocator>, typename FifoWorker::work_item,
Allocator>::processor_handle
boost::statechart::fifo_scheduler<FifoWorker,
Allocator>::create_processor(Arg1) [with Processor = Test, Arg1 =
Object&, FifoWorker =
boost::statechart::fifo_worker<std::allocator<void> >, Allocator =
std::allocator<void>]'
test.cc:36:   instantiated from here
/usr/include/boost/noncopyable.hpp:27: error:
'boost::noncopyable_::noncopyable::noncopyable(const
boost::noncopyable_::noncopyable&)' is private
test.cc:9: error: within this context
/usr/include/boost/statechart/fifo_scheduler.hpp: In member function
'typename
boost::statechart::processor_container<boost::statechart::fifo_scheduler
<FifoWorker, Allocator>, typename FifoWorker::work_item,
Allocator>::processor_handle
boost::statechart::fifo_scheduler<FifoWorker,
Allocator>::create_processor(Arg1) [with Processor = Test, Arg1 =
Object&, FifoWorker =
boost::statechart::fifo_worker<std::allocator<void> >, Allocator =
std::allocator<void>]':
/usr/include/boost/statechart/fifo_scheduler.hpp:63: note: synthesized
method 'Object::Object(const Object&)' first required here 
/usr/include/boost/statechart/fifo_scheduler.hpp:63: error:
initializing argument 3 of 'WorkItem
boost::statechart::processor_container<Scheduler, WorkItem,
Allocator>::create_processor(boost::weak_ptr<std::auto_ptr<boost::statec
hart::event_processor<Scheduler> > >&, Scheduler&, Arg1) [with Processor
= Test, Arg1 = Object, Scheduler =
boost::statechart::fifo_scheduler<boost::statechart::fifo_worker<std::al
locator<void> >, std::allocator<void> >, WorkItem =
boost::function0<void>, Allocator = std::allocator<void>]'

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net