elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++11] (Consulta) El compilador me pide que ponga la palabra typename
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++11] (Consulta) El compilador me pide que ponga la palabra typename  (Leído 1,760 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
[C++11] (Consulta) El compilador me pide que ponga la palabra typename
« 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!


En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
« Respuesta #1 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.


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
« Respuesta #2 en: 19 Febrero 2017, 19:47 pm »

¿por que el compilador no sabe hacer esa distincion? Gracias por la respuesta
En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
« Respuesta #3 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.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C++11] (Consulta) El compilador me pide que ponga la palabra typename
« Respuesta #4 en: 19 Febrero 2017, 20:01 pm »

Ah vale. De acuerdo. Muchas gracias por tus rapidad respuestas
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con Seleccionar Palabra por Palabra
Programación Visual Basic
RickJack 6 5,390 Último mensaje 15 Septiembre 2008, 23:47 pm
por RickJack
Como hacer /una/palabra/ en vez de ?1=una&2=palabra « 1 2 3 »
PHP
dimitrix 20 9,678 Último mensaje 14 Enero 2010, 00:24 am
por dimitrix
contar caracteres de una palabra y devolver que palabra es en java
Java
Cooltan 4 23,530 Último mensaje 6 Abril 2011, 12:21 pm
por Cooltan
Duda sobre seleccionar palabra por palabra en RichTextBox (vb.net)
.NET (C#, VB.NET, ASP)
Susoch 3 6,651 Último mensaje 19 Enero 2012, 18:15 pm
por Susoch
insertar palabra por palabra a una matriz
Programación C/C++
Fabi0lo 3 3,324 Último mensaje 20 Octubre 2012, 18:17 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines