Si consideri il seguente codice:parziale specializzazione Template e ICC
template <class T, class U, class V>
struct Foo { };
template <class T, class U>
struct Foo<T, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated";
}
};
template <class U>
struct Foo<double, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated special";
}
};
struct Bar {
static const int value = 0;
};
int main(int argc, char ** argv)
{
using Baz = Foo<double, Bar, std::integral_constant<int, 0>>;
Baz::print();
return 0;
}
Quando compilo questo con ICC 16.0.1, ricevo il seguente messaggio:
main.cpp(38): error: more than one partial specialization matches the template argument list of class "Foo<double, Bar, std::integral_constant<int, 0>>"
"Foo<T, U, std::integral_constant<int, U::value>>"
"Foo<double, U, std::integral_constant<int, U::value>>"
Baz::print();
Con clangore 3.7.1 e GCC 5.3.0 si compila (e viene stampato lo "speciale istanziato"). Si tratta di un bug in icc o il mio codice è errato? A me sembra chiaro che la seconda specializzazione è strettamente più specializzata della prima; è identico al primo diverso dal fatto che blocca il primo parametro del template.
Edit: dovrei aggiungere: se questo è un bug in icc, c'è una buona soluzione?
Sicuramente mi sembra un errore in icc. – Cameron
Puoi verificare se i suggerimenti nei [commenti seguenti] (https://stackoverflow.com/questions/37216212/partial-template-specialization-and-icc#comment61972971_37216503) risolvono il problema su ICC, per favore? Non è una soluzione completa per il tuo problema, ovviamente, solo un passo avanti nelle indagini. – bogdan
Nel codice attuale, il numero intero proviene da un membro annidato di U, questo a sua volta ha causato problemi di clang, quindi il mio collega si è spostato dai parametri di tipo non di tipo a tipo. –