tengo código como este¿Por qué no range-para encontrar mis sobrecargas de inicio y fin para std :: istream_iterator?
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();
donde std::istream_iterator<std::string>
's begin()
y end()
se definen como sigue
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>();
}
que es lo Mark Nelson también ha escrito en Dr. Dobb here. Por desgracia, el código falla al compilar en mi Visual Studio 2012 con mensajes de error
error C3312: ninguna función se puede llamar 'comenzará encontrado para el tipo 'std :: istream_iterator < _Ty>'
y
error C3312: ninguna función se puede llamar 'fin' encontrado para el tipo 'std :: istream_iterator < _Ty>'
Pregunta: ¿Hay algo que no haya notado, error en el compilador (poco probable, pero por las dudas) o ... Bueno, ¿alguna idea?
Estas preguntas se limpian considerablemente, según lo aconsejado por Xeo. Para proporcionar más antecedentes y referencias relacionadas con mi other question en Stackoverflow, me preguntaba cómo hacer que el análisis basado en líneas sea más limpio que los bucles habituales. Un poco de codificación y comprobación de la Internet, y yo tenía un bosquejo de trabajo de la siguiente manera
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();
pero no había ligero inconveniente Traté de poner remedio. Creo que sería un aspecto más natural de escribir como en el código que falla al compilar y no como
for(auto& entry : istream_range<std::string>(file)
Por favor, tome nota de los diferentes iterador. El delimeter_tokens se define como Nawaz amablemente ha mostrado here (código no duplicado) y istream_range como en el blog de Code Synthesis here. Creo que las implementaciones de inicio y fin deberían funcionar, como se anuncia en la publicación de blog Code Synthesis
La última regla (la alternativa a las funciones autónomas begin() y end) nos permite adaptar de forma no invasiva un contenedor existente a la interfaz de bucle basada en rango.
Así mi pregunta con todos los (ir) antecedentes relevantes.
he tomado la libertad de cambiar el título de la pregunta para reflejar la pregunta real pedido. Deshacer o cambiar si es necesario. – Xeo
Es mejor así, creo. Llama la atención de aquellos que buscan una solución similar a la mía y aquellos que tienen el problema de búsqueda para resolver. ¿Cómo puedo hacer que su publicación sea una respuesta (o alguien más capacitado lo hace)? – Veksi
¡Gracias por eso también! : D – Veksi