Salut à vous!

Je souhaite surcharger un trait pour une template de structure (Item) membre d'une autre template de structure (System).
Bien entendu, je n'y arrive pas.
Mon compilateur est Visual C++ 2019 en 16.9.6.

Voici le code:
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
template <typename... Ts>
// requires Ts.. tous distincts
struct System {
    template <typename T>
    // requires T est dans Ts
    struct Item {
      static constexpr std::size_t index = 0;// en vrai, c'est index_in_types<T, Ts...>, mais pour l'exemple, ca suffira bien.
    };
};
 
 
// le trait (cas général)
template <typename T>
struct trait: std::false_type {};
 
// le cas que j'essaie d'écrire
template <typename T, typename... Ts>
struct trait< typename System<Ts...>::template Item<T> >: std::true_type {};
Visual se plaint pour [c]T[§c] et Ts....
Citation Envoyé par Visual C++
error C2764: T : paramètre de modèle non utilisé ou pouvant être déduit dans la spécialisation partielle 'trait< typename System<Ts...>::template Item<T> >'
Soit je suis bigleuse, soit il y a quelque chose d'étrange dont j'ai pas conscience.


Et si j'introduis un alias, j'obtiens le même résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
template <typename T, typename... Ts>
using alias = typename System<Ts...>::template Item<T>;
 
template <typename T, typename... Ts>
struct trait< alias <T, Ts...> >: std::true_type {};
L'idée sous-jacente est de pouvoir écrire un concept qui accepte les Item et quelques types construits avec (technique du template expression)

Comment puis-je m'en sortir?