У меня есть такой код
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(file))
{
std::cout << entry << std::endl;
}
}
file.close();
где std::istream_iterator
с begin()
и end()
определяются следующим образом
template
std::istream_iterator begin(std::istream_iterator& stream)
{
return stream;
}
template
std::istream_iterator end(std::istream_iterator& stream)
{
return std::istream_iterator();
}
об этом Марк Нельсон также писал в здесь доктора Добба. Увы, код не компилируется в моей Visual Studio 2012 с сообщениями об ошибках
error C3312: no callable 'begin' function found for type 'std::istream_iterator<_Ty>'
. и
error C3312: no callable 'end' function found for type '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(file)
{
std::cout << entry << std::endl;
}
}
file.close();
но была небольшая загвоздка, которую я пытался исправить. Думаю, естественнее было бы написать как в коде, который не компилируется, а не как
for(auto& entry : istream_range(file)
Пожалуйста, обратите внимание на другой итератор. разделитель _токены определяется как Наваз любезно показал здесь(код не дублируется )и istream _диапазон как в блоге Code Synthesis здесь .Я думаю, что начальная и конечная реализации должны работать, как рекламируется в вышеупомянутом сообщении блога Code Synthesis
The last rule (the fallback to the free-standing begin()and end() functions) allows us to non-invasively adapt an existing container to the range-based for loop interface.
. Таким образом, мой вопрос со всем (и )соответствующим фоном.