Почему не диапазон -для поиска моих перегрузок начала и конца для итератора std ::istream _?

У меня есть такой код

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.

. Таким образом, мой вопрос со всем (и )соответствующим фоном.

10
задан Community 23 May 2017 в 12:33
поделиться