2016-11-23 13 views
5

In a.hpp I definiert:C++ abhängiger Name: Ist dieser Typname erforderlich?

#include <utility> 
namespace Board { 
    template<int W, int H> 
    struct GroupNode 
    { 
     using PointType = std::pair<int, int>; 
     // ... 
    }; 
} 

Dann in b.cpp I definiert:

#include "a.hpp" 
namespace Board { 
    template<int W, int H> 
    struct NodeList 
    { 
     using StdList = std::list < /* typename */ GroupNode<W, H>>; 
    } 
} 
// and then use NodeList<19, 19> nl; 

Der obige Code sowohl auf gcc-6 kompiliert werden könnte und klirren-3.9 ohne Warnung. Allerdings klagte Clion 2016.3 cannot resolve variable GroupNode in b.cpp. Ein Kommentar typename konnte Clion Warnung zähmen, aber ich fragte mich, ob diese typename erforderlich ist? Wenn ja, warum gab g ++/clang ++ keine Warnungen aus?

Antwort

5

Nein, es ist nicht erforderlich. Nach [temp.res]/3 in C++ 14:

Wenn eine qualifizierte -ID auf eine Art beziehen soll, das kein Mitglied der aktuellen Instanziierung ist (14.6.2.1) und sein verschachtelter Name-Spezifizierer bezieht sich auf einen abhängigen Typ, der das Schlüsselwort typename vorangestellt werden muss, das ein Typename-Spezifizierer bildet. Wenn die qualifizierte Nummer in einem Type-Name-specifier keinen Typen bezeichnen, das Programm ist schlecht gebildet.

Hier gibt es keine verschachtelten-name-specifier zu einem abhängigen Typ Bezug genommen wird, so ist typename nicht erforderlich. (Nested-Name-Specifier bezieht sich auf eine :: und der Typ oder Namespace auf der linken Seite. Klar, std ist kein Typ, viel weniger ein abhängiger Typ.)

Verwandte Themen