Rozważmy następujący kod:Częściowa specjalizacja szablonu i 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;
}
Kiedy skompilować to z MTK 16.0.1, pojawia się następujący komunikat:
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();
Z brzękiem i gcc 3.7.1 5.3.0 ta kompilacja (i "instancja specjalna" jest drukowana). Czy jest to błąd w Icc, czy mój kod jest niepoprawny? Wydaje mi się jasne, że druga specjalizacja jest ściśle wyspecjalizowana niż pierwsza; jest identyczny jak pierwszy, niż fakt, że blokuje pierwszy parametr szablonu.
Edit: Dodam: jeśli jest to błąd w MTK, czy istnieje dobry obejście?
Sure wygląda jak błąd w Icc dla mnie. – Cameron
można sprawdzić, czy sugestie w komentarzach poniżej [] (https://stackoverflow.com/questions/37216212/partial-template-specialization-and-icc#comment61972971_37216503) rozwiązać problem na MTK, proszę? Niezupełna poprawka dla twojego problemu, oczywiście, tylko krok naprzód w dochodzeniu. – bogdan
W rzeczywistym kodzie, liczba całkowita pochodzi od zagnieżdżonego elementu U, co z kolei spowodowało problemy z klangami, więc mój kolega przesunął się z nie typu na typ parametrów szablonu. –