Rozważmy następujący kod:Alias szablon, częściowa specjalizacja i nieprawidłowy typ parametru void
template<typename F>
struct S;
template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };
template<typename... Args>
using Alias = S<void(Args...)>;
int main() {
S<void(int)> s;
Alias<int> alias;
}
To działa dobrze, jak oczekiwano, a zarówno linię udziałem S
i jeden z udziałem Alias
zdefiniować pod maską tego samego typu S<void(int)>
.
Teraz rozważyć następujące zmiany:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
spodziewałem się, że kompilacja z powodów, które są podobne do tych wymienionych powyżej.
Jest rzeczą oczywistą, że nie skompilować ze względu na linii z udziałem Alias
, zamiast tego pojawia się błąd:
In substitution of 'template using Alias = S [with Args = {void}]'
[...]
error: invalid parameter type 'void'
pytanie jest dość prosta: co brakowało mi tutaj?
Sposób obejścia tego problemu jest oczywisty, ale czy nie powinien on kompilować obu linii z tego samego powodu? Również 'S' prowadzi do dedukcji, która próbuje (dobrze, powodzeniem) stworzyć * typ funkcji, w której parametr ma typ 'void' *. Czy się mylę? –
skypjack
@skypjack Właśnie znalazłem sekcję, której szukałem. 'Void' musi być niezależny. – Barry
Dziękujemy za referencje. W każdym razie, nie jest również 'Args' w' szablon struct S {}; 'typ zależny, który powinien cierpieć na ten sam problem? –
skypjack