Я повторяю boost interval_set<unsigned_int>
и я ожидал, что каждый итератор будет boost interval
, чьи значения будут доступны с upper
а также lower
методы:
boost::icl::interval_set<unsigned int> outages;
// ...
// Insert intervals into the database
for(boost::icl::interval_set<unsigned int>::iterator it =
outages.begin(); it != outages.end(); it++){
DATA_ACQUISITION::InsertInterval(db, it->lower(),
it->upper())
}
Но я получаю ошибки в обоих lower
а также upper
методы: Метод … не может быть решен, что говорит о том, что итератор не указывает на interval
совсем.
Итак, что я на самом деле повторяю здесь? Как перебрать хотя бы intervals
вставлен в interval
_задавать?
РЕДАКТИРОВАТЬ: Добавление SSCCE:
#include <boost/icl/interval_set.hpp>
#include <iostream>
#include <vector>int main() {
boost::icl::interval_set<unsigned int> outages;
for(unsigned int i=0; i<5; i++){
outages += boost::icl::discrete_interval<unsigned int>::closed(
(i*10), ((i*10) + 5));
}
for(boost::icl::interval_set<unsigned int>::iterator it =
outages.begin(); it != outages.end(); it++){
std::cout << it->lower() << boost::icl::upper(*it);
}
return 0;
}
Дополнительная информация:
По крайней мере, в последней версии это не проблема:
#include <boost/icl/interval_set.hpp>
#include <iostream>
int main() {
typedef boost::icl::interval_set<unsigned int> set_t;
typedef set_t::interval_type ival;
set_t outages;
outages.insert(ival::closed(1,1));
outages.insert(ival::open(7,10));
outages.insert(ival::open(8,11));
outages.insert(ival::open(90,120));
for(set_t::iterator it = outages.begin(); it != outages.end(); it++){
std::cout << it->lower() << ", " << it->upper() << "\n";
}
}
Печать
1, 1
7, 11
90, 120
Если старые версии Boost напрямую не поддерживают участников, попробуйте бесплатные функции:
std::cout << lower(*it) << ", " << upper(*it) << "\n";
Здесь ADL находит перегрузки, объявленные в boost::icl
Пространство имен
Наконец, я понял, что ошибки не в компиляции, а в Eclipse CDT и не имеют никакого эффекта.