Si consideri il codice:È legale di specializzarsi parzialmente classe interna template variadic con args dal modello variadic di una classe esterna
#include <iostream>
template <class... Ts>
struct outer {
template <class... ITs>
struct inner {
static constexpr bool value = false;
};
template <class... ITs>
struct inner<Ts..., ITs...> {
static constexpr bool value = true;
};
};
int main() {
std::cout << outer<int, float, double>::inner<int, float, double, int>::value << std::endl;
}
il codice viene compilato con clangore ++ ma non con g ++ dove si produce un errore:
temp3.cc:11:11: error: parameter pack argument ‘Ts ...’ must be at the end of the template argument list
struct inner<Ts..., ITs...> { ^
Come ho già stabilito here la specializzazione parziale della classe interna dovrebbe essere legittima.
Edit: Per completezza vale la pena di aggiungere che clang per il codice di cui sopra avverte che si potrebbe avere un problema con i suoi parametri dedurre ancora farlo senza problemi ...
Non conosco esattamente le regole, ma quando ottengo un errore con un tipo dipendente, l'aggiunta di 'typename' o' template' prima di qualche volta aiuta. Prova 'struct inner
Dani
dopo l'aggiunta di 'typename' ottengo' temp3.cc:11:39: errore: l'argomento modello 1 non è valido' –
Si noti che lo scenario richiesto può ancora essere implementato con qualche modello aggiuntivo metaprogrammazione ... http://coliru.stacked-crooked.com/a/0c6c643c8ff5809e (sì, so che non era la domanda, ma la sfida di implementarlo era inevitabile ...). –