Problem polega na tym, że nie wiesz, jak działa wybór specjalizacji szablonu klasy.
Twoja specjalność:
template<int J> struct test<int, J> {int j = J;};
nie utworzyć szablon dla których trzeba tylko przejść w jednym int szablonu parametr.
test<55> jj; // doesn't work because there's no template<int J> struct test
Zamiast co robi jest stworzenie specjalizacji template<class T, int I> struct test
, który będzie używany podczas argumenty szablon do template<class T, int I> struct test
dopasować specjalizacji, tj test<int,J>
.
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
Oto klucz cytat z normą:
w nazwie typu, które odnosi się do specjalizacji klasa szablonu (np A<int, int, 1>
) wykaz argumentem powinien być zgodny z parametrem szablonu listę główny szablon. Argumenty szablonu o specjalizacji są wyprowadzane z argumentów szablonu podstawowego.[nacisk dodane]
- 14.5.5.1 [temp.class.spec.match] p4
Wydaje się, że próbuje ustawić int
jako domyślny typ dla T
przy jednoczesnym ustawianiu niezależnego domyślna wartość dla I
. Myślę, że twoim zamiarem jest móc określić typ i wartość, określić tylko typ i uzyskać 44 jako wartość domyślną, lub podać tylko wartość i uzyskać int jako typ domyślny.
Niestety nie wiem, jak określić niezależne ustawienia domyślne. Możesz podać wartości domyślne (template<class T=int, int I=44> struct test
), ale uzyskanie domyślnego typu będzie również wymagało zaakceptowania wartości domyślnej.
Jednakże, jeśli jesteś gotów użyć drugie imię to można zrobić:
template <int I>
using test_int = test<int, I>;
To tworzy alias szablonu tak, że trzeba tylko określić wartość:
test_int<55> jj;
I skończy się to używaniem jakiejkolwiek specjalizacji, aby rozstrzygnąć, czy istnieje wyraźna specjalizacja, czy też kompilator generuje ukrytą.
Czy można połączyć komunikat o błędzie? – Morwenn