у меня такой код
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry : std::istream_iterator<std::string>(file))
{
std::cout << entry << std::endl;
}
}
file.close();
где std::istream_iterator<std::string>
begin()
и end()
определяются следующим образом
template<class T>
std::istream_iterator<T> begin(std::istream_iterator<T>& stream)
{
return stream;
}
template<class T>
std::istream_iterator<T> end(std::istream_iterator<T>& stream)
{
return std::istream_iterator<T>();
}
об этом Марк Нельсон также написал в здесь. Увы, код не компилируется в моей Visual Studio 2012 с сообщениями об ошибках.
ошибка C3312: не найдена вызываемая функция «начало» для типа «std::istream_iterator‹_Ty>»
и
ошибка C3312: не найдена вызываемая функция "конец" для типа "std::istream_iterator‹_Ty>"
Вопрос: Я что-то не заметил, баг в компиляторе (маловероятно, но на всякий случай) или... Ну, есть идеи?
Этот вопрос значительно устранен, как советует Xeo. Чтобы предоставить больше информации и ссылок, это связано с моим другой вопрос в Stackoverflow, мне было интересно, как сделать синтаксический анализ на основе строк чище, чем обычные циклы. Немного кода и проверки из интернета, и у меня был рабочий эскиз следующим образом.
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry : istream_range<std::string>(file)
{
std::cout << entry << std::endl;
}
}
file.close();
но была небольшая загвоздка, которую я пытался исправить. Думаю, естественнее было бы написать как в коде, который не компилируется, а не как
for(auto& entry : istream_range<std::string>(file)
Пожалуйста, обратите внимание на другой итератор. delimeter_tokens определяется как Nawaz любезно показал здесь (код не дублируется) и istream_range как в блоге Code Synthesis здесь. Я думаю, что реализации begin и end должны работать, как рекламируется в вышеупомянутом сообщении блога Code Synthesis
Последнее правило (откат к автономным функциям begin() и end()) позволяет нам неинвазивно адаптировать существующий контейнер в интерфейс цикла for на основе диапазона.
Таким образом, мой вопрос со всем (ир) соответствующим фоном.