Warum ist diese Deklaration einer Funktion in der Vorlagenklasse ungültig?

8

Betrachten Sie den folgenden Code:

%Vor%

Wenn ich den Code deklariere, der die Klassen D und D::func() deklariert, sowie die entsprechenden Zeilen in main() , kompiliert der Code normal und ich sehe 2 in der Ausgabe wie erwartet.

Aber wenn ich die abgeleitete Klassenvorlage mache (indem ich typename vor der Funktionsdeklaration hinzufüge, da S<X.6> ein abhängiger Bereich ist), erhalte ich die folgenden Fehler:

%Vor%
  • Warum kann ich func nicht in einer von einer Vorlage abgeleiteten Klasse deklarieren, während ich in einer Nicht-Template-Klasse OK habe?
  • Was genau ist "ungültiger deklarierter Funktionstyp"? Was ist hier ungültig?
Ruslan 01.09.2015, 13:15
quelle

2 Antworten

3
  

N3337 [dcl.fct]/10: A typedef des Funktionstyps kann zum Deklarieren einer Funktion verwendet werden, darf aber nicht zum Definieren einer Funktion verwendet werden.

Nach dieser Regel sind sowohl D als auch W technisch wohlgeformt. Ich denke, der Grund, warum dies nicht mit GCC oder Clang kompiliert wird, ist, dass das Deklarieren einer Funktion mit einem Typedef wirklich selten ist. Die Deklaration einer Funktion mit einem member typedef, das von einem template-Parameter abhängig ist, ist noch seltener. Sieht so aus, als hättest du gerade eine dunkle Ecke getroffen, wo die Compiler-Unterstützung begrenzt ist.

Lustigerweise macht MSVC hier das Richtige .

Ihre beste Option ist wahrscheinlich, eine andere Möglichkeit zu finden, Ihre Klassen auszudrücken. Ich kann keinen gezielten Rat geben, ohne mehr über das Problem zu wissen, das Sie zu lösen versuchen, aber wenn Sie eine neue Frage mit Details stellen, können wir einige Vorschläge machen.

Sie könnten auch darüber nachdenken, einen Fehlerbericht für GCC und Clang .

Bearbeiten:

Wie jedoch Jarod42 darauf hingewiesen hat, könnte der abhängige Typ später als etwas anderes als ein Funktionstyp definiert werden, wodurch die Deklaration ungültig wird. Der Grund dafür, dass MSVC nicht in GCC und Clang funktioniert, ist der gleiche Grund, warum MSVC an einigen Stellen nicht typename benötigt: Es implementiert keine zweiphasige Suche. Wenn dieser Fall vollständig spezifiziert wäre, würde etwas wie function_typename erfordern, um einen abhängigen Namen als einen Funktionstyp zu markieren. Ich denke, eine Funktion basierend auf einem abhängigen Typ zu deklarieren ist unterspezifiziert und inkonsistent, da dies ein sehr seltener Fall ist.

    
TartanLlama 01.09.2015, 13:58
quelle
0

Wie die Fehlermeldung besagt: In D func ist keine Member-Funktion, daher können Sie keine Definition dafür angeben. Es ist ein Mitglied mit dem Typ S<X,6>::func .

    
zaw 01.09.2015 13:26
quelle

Tags und Links