Próbowałem znaleźć zwięzły cytat ze standardu, ale nie sądzę, że Jest to jeden. Faktem jest, że nie ma czegoś takiego jak częściowa specjalizacja funkcji szablonu (lub, jeśli o to chodzi, aliasu szablonu). Tylko szablony zajęć mogą mieć częściowe specjalizacje.
Zapomnijmy o szablonach na sekundę. W C++ istnieje duża różnica między nazwami klas i nazwami funkcji. Może istnieć tylko jedna definicja klasy w danym zakresie. (Możesz mieć różne deklaracje, ale wszystkie odnoszą się do Jedynej Prawdziwej Klasy.) Tak więc nazwa naprawdę identyfikuje klasę.
Z kolei nazwa funkcji jest rodzajem identyfikacji grupowej. Możesz zdefiniować dowolną liczbę funkcji w zakresie o dokładnie takiej samej nazwie. Kiedy używa się nazwy funkcji do wywoływania funkcji, kompilator musi dowiedzieć się, która funkcja naprawdę miała na myśli, patrząc na różne możliwości i dopasowując sygnaturę każdego z nich za pomocą dostarczonych argumentów. Nie ma związku między różnymi funkcjami, które mają wspólne imię; są całkowicie odrębnymi bytami.
Tak, nic wielkiego. Wiedziałeś o tym wszystkim, prawda? Ale teraz wróćmy do szablonów.
Nazwa klasy szablonowej jest nadal unikatowa.Chociaż możesz zdefiniować częściowe specjalizacje, musisz wyraźnie wyspecjalizować tę samą klasę szablonową. Mechanizm ten wygląda pozornie podobnie jak algorytm rozpoznawania nazw funkcji, o którym mowa powyżej, ale istnieją znaczne różnice - jednym z nich jest to, że w przeciwieństwie do prototypów funkcji nie można mieć dwóch szablonów klas w tym samym zakresie z różnymi rodzajami parametrów szablonu.
Z kolei funkcje szablonów nie wymagają definiowania unikalnych nazw. Templating nie zastępuje normalnego mechanizmu przeciążenia funkcji. Tak więc, gdy kompilator próbuje dowiedzieć się, co oznacza nazwa funkcji, musi uwzględnić wszystkie szablony i niesformatowane deklaracje dla tej nazwy funkcji, rozwiązać szablony z zestawem przyporządkowania parametrów szablonu (jeśli to możliwe), a następnie raz ma listę możliwych obiektów funkcji, wybierz najlepszy z normalną rozdzielczością przeciążenia.
To całkiem inny algorytm niż szablonowa rozdzielczość szablonów szablonów. Zamiast dopasowywać listę podanych argumentów szablonów do listy zadeklarowanych parametrów szablonów, czyli w jaki sposób rozpoznaje szablony klas, musi przyjmować każdą szablonową funkcję, która może pasować (ma co najmniej odpowiednią liczbę parametrów, na przykład) ; dedukuj parametry szablonu przez ujednolicenie dostarczonych argumentów za pomocą szablonu; a następnie dodaj specjalizację rozstrzygnięcia do zestawu przeciążeniowego dla kolejnej rundy rozdzielczości przeciążania.
Przypuszczam, że możliwe byłoby również dodanie do tego procesu częściowej specjalizacji, ale interakcje między częściową specjalizacją a przeciążeniem funkcji wydają mi się prawdopodobnie prowadzić do zachowania pseudo-magicznego. W tym przypadku nie było to konieczne, a więc nie ma takiego mechanizmu. (Możesz w pełni wyspecjalizować szablon funkcji, pełna specjalizacja oznacza, że nie ma żadnych argumentów do wyprowadzenia szablonu, więc nie stanowi to problemu).
To jest miarka: nie możesz częściowo specjalizować funkcji szablonowej, ale istnieje nic Cię nie powstrzymuje przed zapewnieniem dowolnej liczby szablonów funkcji o tej samej nazwie. Wszystkie z nich będą rozpatrywane w rozdzielczości przeładowania, a najlepsza wygra, jak zwykle.
Zwykle jest to wystarczające do zaspokojenia potrzeb związanych z przeładowaniem. Powinieneś pomyśleć o szablonowych funkcjach dokładnie w ten sam sposób, w jaki myślisz o normalnych funkcjach: wymyślić sposób wybrania tego, który chcesz na podstawie dostarczonych argumentów. Jeśli uważasz, że naprawdę potrzebujesz dostarczyć parametry szablonu w wywołaniu funkcji, zamiast je wydedukować, po prostu uczyń funkcję (prawdopodobnie statyczną) członkiem klasy szablonowej i podaj argumenty szablonu dla klasy.
nadzieję, że pomoże ...
Prawie duplikat: http://stackoverflow.com/questions/12335762/partial-specialization-of-member-function i http://stackoverflow.com/questions/165101/invalid-use-of-incomplete-type- Specjalizacja błędu z częściowym szablonem. – jogojapan