Итерация boost :: icl :: interval_set

Я повторяю 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;
}

Дополнительная информация:

  • В настоящее время я не добавляю никаких библиотек для компоновщика (до сих пор не было ошибок, свидетельствующих о том, что мне это нужно, и я так и не нашел, какой аргумент мне следует добавить в -l)
    • Компилятор g ++ 4.8.1
    • Буст версия: 1.46

5

Решение

По крайней мере, в последней версии это не проблема:

Жить на Колиру

#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 Пространство имен

9

Другие решения

Наконец, я понял, что ошибки не в компиляции, а в Eclipse CDT и не имеют никакого эффекта.

1