Zum Beispiel:Wie sollte eine Variablenvorlage in C++ 14 bezeichnet werden, wenn sie im Klassenbereich deklariert wird?
class example{
public:
template <class T> static constexpr T var = T(1.5);
};
int main(){
int a = example::var<int>;
example obj;
int b = obj.var<int>;
return 0;
}
GCC produziert Fehler sowohl für: 'example::var<T>' is not a function template
und 'var' is not a member template function
Clang korrekt die erste kompiliert, sondern ein Fehler für die zweite produziert: cannot refer to member 'var' in 'example' with '.'
Gemäß der C + +14 Standard (ISO/IEC 14882: 2014):
Abschnitt 14, Absatz 1.
A variable template at class scope is a static data member template.
Abschnitt 9.4, Absatz 2.
A static member s of class X may be referred to using the qualified-id expression X::s; it is not necessary to use the class member access syntax (5.2.5) to refer to a static member. A static member may be referred to using the class member access syntax, in which case the object expression is evaluated.
Daher IMHO, eine Variable Vorlage bei der Klasse Rahmen (das heißt ein Static Data Mitglied Template) könnte in beiden Richtungen bezeichnet. Könnte es ein Fehler in den Compilern sein?
Das einzige, was ich dieses Verhalten zu rechtfertigen, um zu versuchen zu finden ist dieser Satz in Abschnitt 9.4.2, Absatz 1:
A static data member is not part of the subobjects of a class.
Allerdings sind die beiden vorgenannten Absätzen noch gültig ist. Außerdem habe ich das gleiche Beispiel versucht, das auf andere statische Mitglieder wie eine Variable, eine Funktion und eine Funktionsschablone verweist, und alle von ihnen kompilieren erfolgreich in GCC und Clang.
class example{
public:
static int constexpr variable = 1;
void static function(){ return; }
template <class T> void static function_template(){ return; }
};
int main(){
example obj;
int a = obj.variable;
int b = example::variable;
obj.function();
example::function();
obj.function_template<int>();
example::function_template<int>();
return 0;
}
Vielen Dank im Voraus.
Hinweis 1: Compilerversionen sind 3.7.0 und gcc 5.2.1.
Anmerkung 2: das Schlüsselwort static
erforderlich: Variable template at class scope
Anmerkung 3: da ich die Variable Vorlage initialisieren möchten, das Schlüsselwort constexpr
auch, weil in meinem eigentlichen Code erforderlich ist, werde ich es mit float, double instanziiert und lang doppelt (siehe C++ 14 Standard (ISO/IEC 14882: 2014), Abschnitt 9.4.2, Absatz 3).
Hinweis 4: tatsächliche "Definitionen" dieser statischen Datenelemente außerhalb der Klasse (d. H. template <class T> constexpr T example::var;
) werden in diesem Beispiel nicht benötigt. Ich habe es auch versucht, aber es macht keinen Unterschied.
Welche Version von gcc verwenden Sie? g ++ 6.2 verhält sich wie clang. Aber im Gegensatz zu clang lautet die Fehlermeldung für 'obj.var', dass * "' var' ist keine Elementvorlagenfunktion "*. Es scheint, dass der erste Teil seit g ++ 5 behoben wurde. –
Holt
Ich benutze gcc 5.2.1 und clang 3.7.0 :) –
Clang Stamm akzeptiert diesen Code. –