Tôi có chứa này:Tôi làm cách nào để sử dụng BOOST_FOREACH với vùng chứa chỉ hỗ trợ const_iterator?
class /*final*/ Row
{
public:
typedef FieldIterator const_iterator;
typedef FieldIterator iterator;
FieldIterator begin() const;
FieldIterator end() const;
FieldIterator begin();
FieldIterator end();
...
};
Cho rằng, đoạn mã sau biên dịch tốt:
BOOST_FOREACH(Field field, row)
{
}
Tuy nhiên, lớp không có iterator mutable, do đó, tôi đã thay đổi lớp Row, bằng cách xóa quyền truy cập có thể thay đổi:
class /*final*/ Row
{
public:
typedef FieldIterator const_iterator;
FieldIterator begin() const;
FieldIterator end() const;
...
};
Nhưng bây giờ cùng vòng lặp foreach không biên dịch:
1>o:\c\boost_1_48_0\boost\foreach.hpp(364): error C2039: 'type' : is not a member of 'boost::mpl::eval_if<C,F1,F2>'
1> with
1> [
1> C=boost::mpl::false_,
1> F1=boost::range_const_iterator<sqlserver::Row>,
1> F2=boost::range_mutable_iterator<sqlserver::Row>
1> ]
1> c:\dev\internal\playmssqlce\playmssqlce.cpp(29) : see reference to class template instantiation 'boost::foreach_detail_::foreach_iterator<T,C>' being compiled
1> with
1> [
1> T=sqlserver::Row,
1> C=boost::mpl::false_
1> ]
...
Từ thông báo lỗi Tôi hiểu rằng BOOST_FOREACH
cố gắng khởi tạo loại range_mutable_iterator
, điều này rõ ràng là không thành công. Làm thế nào để làm cho nó để nhanh chóng phạm vi liên tục thay thế?
Cảm ơn.
EDIT
Đây là tờ khai lớp hoàn chỉnh cho và :
class /*final*/ Row
{
const BYTE *m_buffer;
const DBBINDING *m_pColumnBindings;
int m_columnBindingCount;
FieldIterator m_end;
public:
typedef FieldIterator const_iterator;
typedef FieldIterator iterator;
Row(const BYTE *buffer, const DBBINDING *pColumnBindings, int columnBindingCount);
bool isSameRow(const Row& r) const;
int fieldCount() const;
Field field(int i) const;
Field& field(int i, void *fieldBuffer) const;
FieldIterator begin() const;
FieldIterator end() const;
FieldIterator begin();
FieldIterator end();
};
class FieldIterator : public iterator_facade<FieldIterator, Field, boost::random_access_traversal_tag>
{
const Row *m_pRow;
int m_index;
mutable BYTE m_fieldBuffer[sizeof(Field)];
public:
FieldIterator(const Row *pRow = NULL, int index = 0);
private:
friend class boost::iterator_core_access;
void increment();
void decrement();
void advance(difference_type n);
difference_type distance_to(FieldIterator it);
reference dereference() const;
bool equal(const FieldIterator& rhs) const;
};
Có 'BOOST_FOREACH (const Field & field, row)' hoạt động không? – Ferruccio
Cùng một kết quả chính xác. – mark