Я не уверен в названии, потому что я не уверен, что проблема связана с «копийностью» моего контейнера. Я попробовал совсем все, но я не могу избавиться от этой ошибки.Невозможно выполнить итерацию в контейнере, не подлежащем копированию, возвращаемом функцией
Вот упрощенная версия моего кода (пожалуйста, не бросить вызов дизайн класса, я действительно хотел бы, чтобы конечный используемый синтаксис в BOOST_FOREACH):
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)
{
}
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::lock_guard<boost::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;
};
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
boost::mutex m;
GetContainer<int> getter(v, m);
BOOST_FOREACH(int i, getter.Get())
{
std::cout << i << std::endl;
}
return 0;
}
Компилятор жалуется, не имея конструктор копирования для MyContainer :: MyContainer (const MyContainer &). У меня также есть: ошибка: нет соответствия функции для вызова 'MyContainer :: MyContainer (повышение :: foreach_detail _ :: rvalue_probe> :: value_type)'
Я следую расширяемости советы: http://www.boost.org/doc/libs/1_58_0/doc/html/foreach/extensibility.html#foreach.extensibility.making__literal_boost_foreach__literal__work_with_non_copyable_sequence_types
Но , что составляет
MyContainer<T> : private boost::noncopyable
не решает проблему. Nor определения функции
boost_foreach_is_noncopyable
или Специализируя шаблон-структуру
is_noncopyable
для MyContainer (на самом деле, как бы я специализируюсь этот шаблон для типа шаблона?)
Последний «наконечник ": Если я удаляю мьютекс и замок извне (я просто передаю вектор GetContainer и MyContainer), он работает. Но это не работает, если я делаю
MyContainer<T> : private boost::noncopyable
(я ожидал, что он должен, так что я не уверен, что моя проблема с BOOST_FOREACH, но, возможно, потому, что я вернуть копию MyContainer с моим добытчиком?)
Благодарю вас, если вы прочитаете меня до настоящего момента и заранее заблаговременно за помощь.
копия делается внутри BOOST_FOREACH. Проблема заключается в отсутствии семантики перемещения AFAICT – sehe