[C++11] (Consulta) El compilador me pide que ponga la palabra typename

Iniciado por class_OpenGL, 19 Febrero 2017, 17:39 PM

0 Miembros y 1 Visitante están viendo este tema.

class_OpenGL

Hola, muy buenas. Estoy haciendo una clase 'Vector' en C++ (tamaño dinámico, pero se asigna una sola vez). El caso es que uno de los constructores acepta una initializer_list, donde puedes poner todos los componentes del vector. Este es el código:

Código (c++) [Seleccionar]
template<typename TipoComponente>
class Vector {
   [...]
   public:
      [...]
      Vector(const std::initializer_list<TipoComponente> &componentes)
         : Vector(componentes.size())
      {
         typename std::initializer_list<TipoComponente>::const_iterator iterador = componentes.begin();
         int i = 0;
         
         while(iterador != componentes.end()) {
            vector[i] = *iterador;
            i++;
            iterador++;
         }
      }
      [...]
};


LA pregunta es: ¿por qué el compilador me obliga a poner la palabra 'typename' antes de la declaración del iterador? Este es el error que sale si no la pongo:

||=== Build: Debug in Reversi (compiler: GNU GCC Compiler (x86_64)) ===|
..\Reversi\reversi\herramientas\vector.hpp||In constructor 'Vector<TipoComponente>::Vector(const std::initializer_list<_Tp>&)':|
..\Reversi\reversi\herramientas\vector.hpp|22|error: need 'typename' before 'std::initializer_list<_Tp>::const_iterator' because 'std::initializer_list<_Tp>' is a dependent scope|
..\Reversi\reversi\herramientas\vector.hpp|22|error: expected ';' before 'iterador'|
..\Reversi\reversi\herramientas\vector.hpp|25|error: 'iterador' was not declared in this scope|
..\Reversi\reversi\herramientas\vector.hpp||In instantiation of 'Vector<TipoComponente>::Vector(const std::initializer_list<_Tp>&) [with TipoComponente = float]':|
C:\Users\Carlos\Desktop\Programacion\Proyectos\Reversi\main.cpp|43|required from here|
..\Reversi\reversi\herramientas\vector.hpp|22|error: dependent-name 'std::initializer_list<_Tp>::const_iterator' is parsed as a non-type, but instantiation yields a type|
..\Reversi\reversi\herramientas\vector.hpp|22|note: say 'typename std::initializer_list<_Tp>::const_iterator' if a type is meant|
||=== Build failed: 4 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|


No me entero muy bien de lo que me queire decir el compilador. Espero que me puedan ayudar. Muchas gracias!

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Código (cpp) [Seleccionar]
std::initializer_list<TipoComponente>::const_iterator
initializer_list es un template. En el momento, el compilador no sabe si const_iterator es un campo static o si es un tipo. Para indicarle que es un tipo, se pone el typename.

class_OpenGL

¿por que el compilador no sabe hacer esa distincion? Gracias por la respuesta

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

"No sabe" tal vez fuera una mala forma de expresarlo. Pueden darse casos en los que A<X>::b sea un tipo y casos en los que sea un valor. Simplemente, te obliga a ponerlo cuando usas el template. Evita malentendidos y, si por lo que fuera no es un tipo, te dará un error.

class_OpenGL

Ah vale. De acuerdo. Muchas gracias por tus rapidad respuestas

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL