2013-05-15 7 views
14

Standard C++ zakazuje znajomości deklaracji specjalizacyjnych częściowych. (§14.5.3/8):Dlaczego Standard zabrania przyjacielskich deklaracji specjalizacyjnych częściowych?

Oświadczenia o przyjacielu nie będą deklarowały specjalizacji częściowych. [Przykład:

template<class T> class A { }; 
class X { 
    template <class T> friend class A<T*>; //error 
}; 

--end przykład]

pytania, na przykład this one, otrzymałem odpowiedzi, które wywołują ten zakaz, ale chciałbym poznać uzasadnienie . Nie widzę go i nie mogę go znaleźć w mojej ulubionej wyszukiwarce. I może się jednak zdarzyć, że od razu powróci do standardu C++ 98, więc prawdopodobnie jest to bardzo proste i oczywiste uzasadnienie. Czy ktoś może mi to wytłumaczyć?

+3

Jak to "nie jest konstruktywne"? –

+0

@LuchianGrigore: szorstkie przypuszczenie: to rodzaj pyta o możliwe opinie – PlasmaHH

+1

@PlasmaHH, chyba że otrzyma odpowiedź od kogoś, kto rzeczywiście zna przyczynę (jak większość pytań) :) –

Odpowiedz

0

Oto undirect wyjaśnienie: http://www.cprogramming.com/tutorial/template_specialization.html

Ostateczna szczegółów wdrażania wyjdzie z częściowych specjalizacji: jaki sposób pick kompilator który specjalizacja w obsłudze jeśli istnieje kombinacja typów całkowicie generycznych, niektóre częściowe specjalizacje, , a może nawet niektóre pełne specjalizacje? Ogólną regułą jest , że kompilator wybierze najbardziej konkretny szablon specjalizacji - najbardziej specyficzna specjalizacja szablonu to ta, której specjalizuje się w szablonach, których argumenty są akceptowane przez inne deklaracje szablonu, ale które nie przyjmą wszystkich możliwych argumentów te inne szablony o tej samej nazwie będą akceptowane.

Wnioskuję, że być może nie jest możliwe uniknięcie dwuznaczności przy określaniu typu specjalizacji.

+0

Czy możesz podać przykład, gdzie (jeśli jest to dozwolone) spowoduje pobranie specjalizacja jest niejednoznaczna? – David

+0

@faith_k, Dzięki za odpowiedź, ale jest spekulacyjny. Musi być ostateczna odpowiedź i ludzie, którzy o tym wiedzą, więc wytrzymam. –

+0

Nie kupuję tego w ogóle. Chociaż reguły dotyczące rozdzielczości mogą być skomplikowane, nadal decydują o konkretnym przypadku. Ogólny "specyfikator szablonu znajomego" sprawia, że ​​wszystkie specjalizacje są również znajomymi. Dlaczego specyfikator przyjaciela częściowego specjalizacji nie może po prostu zastosować do wszystkich specjalizacji (w tym do instancji), które pasują do określonego wzorca? – davmac

1

Nie mam referencji, ale podejrzewam, że dzieje się tak, ponieważ spowodowałoby to deklarowanie częściowej specjalizacji w zakresie klasy deklarującej przyjaciela, a nie zakresu danego szablonu, a nie tworzenie zestaw reguł, które wymuszają na deklaracji przyjaciela, że ​​specjalizacja jest w odpowiednim zakresie, po prostu ją zakazują.

+0

Dzięki za odpowiedź, ale jest spekulacyjny. Musi być ostateczna odpowiedź i ludzie, którzy o tym wiedzą, więc wytrzymam. –

Powiązane problemy