Der folgende Code kompiliert erfolgreich mit Klirren 3.5.0 und g ++ 4.9.0 (mit -Wall -Wextra -pedantic-errors
flags) unter C++03 (flag -std=C++03
), C++11 (flag -std=C++11
) und C++14 (flag -std=C++14
):Zusätzliches Schlüsselwort type in der Vorlagenparameterliste: Ist es gültig oder nicht?
namespace N
{
typedef int T;
enum E{};
}
template <typename N::T>
struct ST{};
template <typename N::E>
struct SE{};
int main()
{
}
Ist es gültig zusätzliche typename
Keyword hinzufügen vor einer Nicht-Typ-Template-Parameter-Deklaration?
Beachten Sie, dass der folgende Code kompiliert nicht (wie C++03, C++11 und C++14 code):
typedef int T;
enum E{};
template <typename T t>
struct ST{};
template <typename E e>
struct SE{};
int main()
{
}
Aber das folgende kompiliert wieder in Ordnung (C++03, C++11 und C++14) :
typedef int T;
enum E{};
template <typename ::T>
struct ST{};
template <typename ::E>
struct SE{};
int main()
{
}
Ich vermute, dass 'typename N :: T' geparsed als ein Typparameter, nicht verwandt mit dem tatsächlichen Typ' N :: T'. Der Name ist jedoch seltsam. – leemes
@dyp Und was sollte aus Ihrem Angebot folgen? – Constructor
@leemes Ja, das denke ich auch. Und es ist * sehr * seltsam. – Constructor