2014-12-16 10 views
5

Próbuję w większym stopniu uchwycić składnię i semantykę szablonów, wyobrażając sobie konstrukcje arcane. Wierzę, że po składnia nie jest dozwolone przez standard C++ 11:Gdzie w standardzie C++ 11 zabrania 'szablonu <typename T> klasy A {...}; szablon <typename T> klasa A <int> {...}; ' (jeśli gdziekolwiek)?

template <typename T> 
class A 
{...}; 

// phony "specialization" 
template <typename T> 
class A<int> 
{...}; 

Jednak nie mogę znaleźć w standardzie C++ 11, gdzie ta składnia jest niedozwolone.

Czy mam rację, że pokazana składnia jest zabroniona przez standard C++ 11? Jeśli tak, to gdzie można stwierdzić, że składnia jest niedozwolona?

+1

To jest błąd, który otrzymujesz z clang ++: "błąd: częściowa specjalizacja" A "nie używa żadnego z parametrów szablonu". Sądzę więc, że musisz przeszukać sekcję specjalizacji częściowej, związaną z użyciem jej parametrów szablonu. PS: g ++ mówi "błąd: parametry szablonu nie są dedukowalne w częściowej specjalizacji:" – vsoftco

+0

@vsoftco Załóżmy, że masz "szablon klasa A {T t; }; ' –

+0

@Yakk być może odpowiedź brzmi, że jest to spowodowane faktem, że jest logicznie niemożliwe, aby konstrukt miał sens, że jest niedozwolony, lub fakt, że nie jest nigdzie opisywany jako * dozwolony * konstrukt, który sprawia, że ​​jest niedozwolony, zamiast tego jest nigdzie zabronione. –

Odpowiedz

3

Jestem dość zaskoczony, że nie ma wyraźnego oświadczenia w 14.5.5 [temp.class.spec] mówiąc, że wszystkie parametry szablonu częściowej specjalizacji szablonów klas muszą być użyte na liście szablonów-argumentów. To spowodowałoby, że template<class T> class A<int> jest nieważny, ponieważ T nie jest używane na liście szablonów-argumentów <int>.

Wydaje mi się, że twoja fałszywa specjalizacja jest niejawnie nieważna z powodu faktu, że nigdy nie można jej dopasować, więc nigdy nie można jej użyć. Jeśli utworzysz instancję A<int>, wtedy dopasujesz szablon podstawowy. Nie może on pasować do twojej specjalizacji, ponieważ ma dodatkowy parametr szablonu, T, którego nie można wyprowadzić (sugerujesz, że można go podać, mówiąc: A<int><double>, ale to nie jest poprawna składnia C++, więc nie pomaga).

Poprosiłem komisję normalizacyjną o wyjaśnienie, dlaczego twoja fałszywa specjalizacja jest nieważna (oczywiście tak jest, ale nie widzę, gdzie to mówi).

Powiązane problemy