Error con T :: iterador, donde la plantilla parámetro T puede ser vector o la lista

StackOverflow https://stackoverflow.com/questions/3735022

  •  03-10-2019
  •  | 
  •  

Pregunta

Estoy intentando escribir una función para imprimir una representación de los contenedores comunes STL (vector, lista, etc ..). Di la función de un parámetro de plantilla T que, por ejemplo, podría representar vector. Estoy teniendo problemas para obtener un iterador de tipo T.

vector<int> v(10, 0);
repr< vector<int> >(v);

...

template <typename T>
void repr(const T & v)
{
    cout << "[";
    if (!v.empty())
    {
        cout << ' ';
        T::iterator i;
        for (i = v.begin(); 
             i != v.end()-1;
             ++i)
        {
            cout << *i << ", ";
        }
        cout << *(++i) << ' ';
    }
    cout << "]\n";
}

...

brett@brett-laptop:~/Desktop/stl$ g++ -Wall main.cpp
main.cpp: In function ‘void repr(const T&)’:
main.cpp:13: error: expected ‘;’ before ‘i’
main.cpp:14: error: ‘i’ was not declared in this scope
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’:
main.cpp:33:   instantiated from here
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant

Me trató 'nombre de tipo T :: iterador', como sugirió el compilador, pero sólo consiguió un error más críptica.

Edit: Gracias por la ayuda chicos! He aquí una versión de trabajo para cualquier persona que quiera utilizar esta función:

template <typename T>
void repr(const T & v)
{
    cout << "[";
    if (!v.empty())
    {
        cout << ' ';
        typename T::const_iterator i;
        for (i = v.begin(); 
             i != v.end();
             ++i)
        {
            if (i != v.begin())
            {
                cout << ", ";
            }
            cout << *i;
        }
        cout << ' ';
    }
    cout << "]\n";
}
¿Fue útil?

Solución

typename necesidad de decirle al compilador que ::iterator se supone que es un tipo. El compilador no sabe que se trata de un tipo, ya que no sabe lo que T es hasta que una instancia de la plantilla. También podría referirse a algún miembro de datos estáticos, por ejemplo. Esa es su primer error.

Su segundo error es que v es una referencia-a- const . Así, en lugar de ::iterator usted tiene que utilizar ::const_iterator. No se puede pedir un contenedor constante para un iterador no constante.

Otros consejos

Cambiar T::iterator i; a typename T::const_iterator i; porque ::iterator es de tipo T y v es un const &.

Antes de tipo dependiente cualificado, necesita typename. Sin typename, hay un C ++ análisis regla que dice que los nombres dependientes calificados deben ser analizados como non-types incluso si conduce a un error de sintaxis.

typename indica que el nombre que sigue debe ser tratado como un tipo. De lo contrario, los nombres se interpretan para referirse a los no-tipos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top