template que c++ templates c++11 typename

que - template typename t c++



Flexibilidad del alias de la plantilla en C++ 0x (2)

Según tengo entendido, los alias de plantillas en C ++ 0x nos permitirán hacer lo siguiente:

template <typename T> using Dictionary = std::map< std::string, T >; Dictionary<int> ints; ints[ "one" ] = 1; ints[ "two" ] = 2;

Tengo dos preguntas:

Primero, podremos hacer esto (enlazar con cualquier tipo, o solo con plantillas):

template <typename Iter> using ValueType = std::iterator_traits<Iter>::value_type;

En segundo lugar, el uso de los alias requerirá el uso de la palabra clave typename en las plantillas, por ejemplo:

template <typename Iter> typename ValueType<Iter> sum(Iter first, Iter last) { ... } // ^ required?

¿O se requiere en la declaración de alias?

using ValueType = typename std::iterator_traits<Iter>::value_type; // ^ required?

¿O tampoco?


La sintaxis es:

template <typename Iter> using ValueType = typename std::iterator_traits<Iter>::value_type;

como con tu segundo

Fuente: http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias

Su ejemplo es:

template<int N> using int_exact = typename int_exact_traits<N>::type; // define alias for convenient notation


typename es obligatorio cuando un tipo de miembro sigue al operador :: y una plantilla-id lo precede.

El uso del typename de typename de typename que menciona no es específico de los alias de plantilla ni es obligatorio a menos que esté creando un alias para un miembro como ::type , pero ese es un caso de uso común.

Por ejemplo, no hay un typename al introducir un nombre de alias simple a una plantilla existente.

template< typename x > class bar; template< typename x > using foo = bar< x >; // no typename needed