den folgenden Code vor:Alias-Vorlage, partielle Spezialisierung und der ungültige Parameter Typ 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;
}
Es funktioniert gut, wie erwartet, und sowohl die Linie anzupassen S
und die eine Beteiligung Alias
unter der Haube definieren die gleiche Art S<void(int)>
. Jetzt
, die folgenden Änderungen:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
ich erwartet, dass es aus Gründen, zu kompilieren, die die denen ähnlich sind oben erwähnt.
Es versteht sich, dass es wegen der Zeile nicht kompilieren Alias
beteiligt, stattdessen erhalte ich die Fehlermeldung:
In substitution of 'template using Alias = S [with Args = {void}]'
[...]
error: invalid parameter type 'void'
Die Frage ist ziemlich einfach: was ich hier verpasst?
Die Problemumgehung ist offensichtlich, aber sollte es nicht fehlschlagen, die beiden Zeilen aus dem gleichen Grund zu kompilieren? Auch 'S' führt zu einem Abzug, der (gut, Erfolg) versucht, um * einen Funktionstyp zu erzeugen, in dem ein Parameter eine Art 'void' * hat. Liege ich falsch? –
skypjack
@skypjack Habe gerade den Abschnitt gefunden, nach dem ich gesucht habe. Die "Leere" muss unabhängig sein. – Barry
Vielen Dank für die Referenz. Wie auch immer, ist nicht auch 'Args' in' Template Struktur S {}; 'ein abhängiger Typ, der unter dem gleichen Problem leiden sollte? –
skypjack