Bonjour à tous!

Je commence à expérimenter un peu avec C++11 sous GCC 4.4.0, étant particulièrement intéressé par les templates variadiques.

Ma première expérience est assez perturbante. J'essaie de créer une fonction qui imprime les types de ses arguments templates via un typeid(...).

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
26
27
28
29
30
31
32
33
34
35
36
 
#include <iostream>
#include <typeinfo>
 
/* Version sans arguments de fonction */
void printType(){
    std::cout << std::endl ;
}
 
template <typename Arg, typename ... Args>
void printType() {
    std::cout << typeid(Arg).name();
    printType<Args...>();
}
 
/* Version avec arguments de fonction */
void printType2(){
    std::cout << std::endl ;
}
 
template <typename Arg, typename ... Args>
void printType2(Arg v, Args ... args) {
    std::cout << typeid(Arg).name();
    printType2(args...);
}
 
 
int main(){
    int a, c, e;
    float b, d;
    printType2(a,b,c,d,e); // ok : sortie du style "ififi"
    printType2(b,c,d,e,a); // ok : sortie du style "fifii"
    printType();              // ok : sortie ligne vide
    printType<int, float>(); // erreur de compilation "no matching function for call printType()"
    return 0;
}
Tout ceci est compilé avec la commande:
c++ -std=gnu++0x variadicTest.cpp

Pouvez vous m'expliquer pourquoi la version du printType sans arguments de fonction (mais arguments templates explicites) ne fonctionne pas? Qu'ai-je râté?

Merci pour tout renseignement!
Daniel