On Tue, 19 May 2015 at 15:16 nico
I'm not sure of the title, because I'm not sure the issue comes from the "copyablility" of my container. I tryied quite everything but I can't get rid of this error.
Hi Nico, You can't do what you are trying to do in C++03. To accomplish it, you need C++11 move semantics to be able to move the MyContainer out of the Get function. Even without using BOOST_FOREACH, the following code fails; GetContainer<int> getter(v, m); MyContainer<int> c = getter.Get(); // <-- Error. Here's an example with the necessary changes; I changed the scoped_lock to a unique_lock and added a move constructor. template <typename T> class MyContainer { public: typedef typename std::vector<T>::iterator iterator; typedef typename std::vector<T>::const_iterator const_iterator; MyContainer(std::vector<T>& vec, boost::mutex& mutex) : m_vector(&vec) , m_lock(mutex) {} MyContainer(MyContainer&& other) : m_vector(other.m_vector) { m_lock = std::move(other.m_lock); other.m_vector = nullptr; } iterator begin() { return m_vector->begin(); } const_iterator begin() const { return m_vector->begin(); } iterator end() { return m_vector->end(); } const_iterator end() const { return m_vector->end(); } private: std::vector<T>* m_vector; boost::unique_lockboost::mutex m_lock; }; template <typename T> struct GetContainer { GetContainer(std::vector<T>& vec, boost::mutex& mutex) : m_vector(vec), m_mutex(mutex) {} MyContainer<T> Get() { return MyContainer<T>(m_vector, m_mutex); } std::vector<T>& m_vector; boost::mutex& m_mutex; }; Once you have move semantics though, you should have access to range-based-for, which is also C++11 for(auto&& i : getter.Get()) { std::cout << i << std::endl; } The above code works, so do you still need BOOST_FOREACH? -- chris