Я работаю с векторным типом , который приходит из библиотеки C и выглядит как
struct Vec {
int *stor_begin;
int *stor_end;
int *end;
};
Я попытался включить цикл for на основе диапазона для этого типа, создав бесплатные функции begin()
и end()
, но я получаю эту ошибку от clang:
ошибка: тип диапазона 'igraph_vector_int_t' имеет элемент 'end', но нет элемента 'begin'
Есть ли способ (с помощью C ++ 11) включить циклы на основе диапазона для такого типа (который я не могу изменить напрямую)?
Вот минимальный пример, демонстрирующий проблему:
// No problems with Foo
struct Foo {
int *fooBeg;
int *fooEnd;
};
int *begin(Foo &foo) { return foo.fooBeg; }
int *end(Foo &foo) { return foo.fooEnd; }
void testFoo(Foo &foo) {
int sum = 0;
for (const auto &x : foo)
sum += x;
}
// Bar does not work because it has a member variable called 'end'
struct Bar {
int *stor_begin;
int *end;
};
int *begin(Bar &bar) { return bar.stor_begin; }
int *end(Bar &bar) { return bar.end; }
void testBar(Bar &bar) {
int sum = 0;
for (const auto &x : bar)
sum += x;
}
Ошибка от gcc 7.2 / Wandbox :
prog.cc: In function 'void testBar(Bar&)':
prog.cc:26:26: error: range-based 'for' expression of type 'Bar' has an 'end' member but not a 'begin'
for (const auto &x : bar) {
^~~
prog.cc:26:26: error: expression cannot be used as a function