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 ?) :
En revanche, dans le cas d'un type membre template, la syntaxe est différente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>(); }
Partager