11

Nie mogę zrozumieć, dlaczego stwierdzenie w głównej jest dwuznaczne.Częściowa niejednoznaczność dotycząca specjalizacji szablonów

template<class T, class U, int I> struct X 
{ void f() { cout << "Primary template" << endl; } }; 


template<class T, int I> struct X<T, T*, I> 
{void f() { cout << "Partial specialization 1" << endl;}}; 

template<class T, class U, int I> struct X<T*, U, I> 
{void f() { cout << "Partial specialization 2" << endl;}}; 

template<class T> struct X<int, T*, 10> 
{void f() { cout << "Partial specialization 3" << endl;}}; 

template<class T, class U, int I> struct X<T, U*, I> 
{void f() { cout << "Partial specialization 4" << endl;}}; 

int main() 
{ 
    X<int, int*, 10> f; 
} 

nie Czy X<int, T*, 10> najbardziej wyspecjalizowany szablon? To jest przykład z http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm

+1

Poniżej podano przykład: Kompilator nie zezwala na deklarację 'X ' f ponieważ może dopasować szablon struct 'X ', szablon struct 'X ' lub szablon struct 'X ', a żadna z tych deklaracji nie jest lepsza od innych. –

Odpowiedz

10

Specjalizacja szablonu jest bardziej wyspecjalizowana niż inna, jeśli każda lista argumentów dopasowana do pierwszej również pasuje do drugiej, ale nie na odwrót.

Patrząc na X<int, T*, 10> i X<T, T*, I>:

  • X<int, float*, 10> dopasowuje pierwszy, ale nie sekundy.
  • X<float, float*, 10> dopasowuje drugi, ale nie pierwszy.

W związku z tym żaden z nich nie jest bardziej wyspecjalizowany niż drugi, a instancja szablonu pasująca do obu specjalizacji nie zostanie skompilowana.

+0

Należy również wspomnieć o częściowym uporządkowaniu specjalizacji szablonów klas, co z kolei zależy od częściowego uporządkowania szablonów funkcji * przeładowanych *, złożonych z parametrów szablonów specjalizacji szablonów klas. – Nawaz

+1

@Nawaz: Wiem, że to sposób, w jaki tłumaczą to w standardzie, ale myślę, że myślę, że będzie to nadkomplikować rzeczy z niewielką korzyścią, aby wyjaśnić to wszystko tutaj (musiałbym również wyjaśnić zasady porządkowania szablonów funkcji z 14.5. 5.2, i odjęcie argumentu szablonu od 14.8.2). Jeśli uważasz, że to wymaga więcej szczegółów, możesz dodać odpowiedź. – interjay

+0

Dzięki, teraz to rozumiem. Przeczytałem wyjaśnienie na końcu, ale nie mogłem zrozumieć, dlaczego 'X ' nie był najbardziej wyspecjalizowany. – user1116459

Powiązane problemy