Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 19 Febrero 2017, 17:39 pm



Título: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
Publicado por: class_OpenGL en 19 Febrero 2017, 17:39 pm
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
  1. template<typename TipoComponente>
  2. class Vector {
  3.   [...]
  4.   public:
  5.      [...]
  6.      Vector(const std::initializer_list<TipoComponente> &componentes)
  7.         : Vector(componentes.size())
  8.      {
  9.         typename std::initializer_list<TipoComponente>::const_iterator iterador = componentes.begin();
  10.         int i = 0;
  11.  
  12.         while(iterador != componentes.end()) {
  13.            vector[i] = *iterador;
  14.            i++;
  15.            iterador++;
  16.         }
  17.      }
  18.      [...]
  19. };

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:

Código:
||=== 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!


Título: Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
Publicado por: ivancea96 en 19 Febrero 2017, 19:15 pm
Código
  1. 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.


Título: Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
Publicado por: class_OpenGL en 19 Febrero 2017, 19:47 pm
¿por que el compilador no sabe hacer esa distincion? Gracias por la respuesta


Título: Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
Publicado por: ivancea96 en 19 Febrero 2017, 19:59 pm
"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.


Título: Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
Publicado por: class_OpenGL en 19 Febrero 2017, 20:01 pm
Ah vale. De acuerdo. Muchas gracias por tus rapidad respuestas