template template et name dependent lookup
J'ai un mal fou à trouver un titre correct pour ce sujet...
J'étais venu avec une question, et en la rédigeant j'ai fini par trouver la bonne syntaxe, je suppose que ça serait pas mal de l'ajouter à la FAQ.
Quand on a un type membre d'une classe, il est nécessaire dans un contexte template de préfixer ce type du mot clé typename pour indiquer au compilateur qu'on attend bien un type (cf. FAQ: A quoi sert le mot-clé typename ?) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <iostream>
#include <typeinfo>
struct test {
// 'type' est un type simple
using type = int;
};
template<typename T>
void print_type() {
std::cout << typeid(T).name() << std::endl;
}
template<typename T>
void print() {
// print_type<T::type>();
// ^ ne compile pas, il faut ajouter 'typename'
// v~~~~~~~
print_type<typename T::type>();
}
int main() {
print<test>();
return 0;
} |
En revanche, dans le cas d'un type membre template, la syntaxe est différente :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <iostream>
#include <typeinfo>
struct test {
// 'type' est un type template
template<typename T>
struct type {};
};
template<template<typename> class T>
void print_type() {
std::cout << typeid(T<int>).name() << std::endl;
}
template<typename T>
void print() {
// print_type<T::type>();
// ^ ne compile pas, il faut ajouter 'template'
// v~~~~~~~
print_type<T::template type>();
} |