2016-11-23 10 views
5

Iに定義:C++依存名:この型名は必須ですか? <code>a.hpp</code>で

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

を次に、b.cppでIが定義:

#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; 

を上記のコードは警告なしGCC-6と打ち鳴らす-3.9の両方でコンパイルすることができます。 しかし、Clion2016.3はb.cppcannot resolve variable GroupNodeを訴えました。コメントを外すと、typenameはClionの警告を駄目にするかもしれませんが、私はこのtypenameが必要かどうか疑問に思っていましたか?もしそうなら、なぜg ++/clang ++が警告を出さなかったのですか?

答えて

5

いいえ、必須ではありません。 C++ 14 3/[temp.res]によれば:修飾-IDは、現在のインスタンスのメンバでないタイプを指すことが意図される

(14.6.2.1) そのネストされた名前指定子は従属型を参照し、typenameというキーワードが接頭辞となり、 タイプ名指定子となります。 修飾IDタイプ名指定子にある場合は、タイプが指定されていません。プログラムは不正です。

はここ依存の型を参照することなしネストされた名指定子ありませんので、typenameは必要ありません。 (ネストされた名前指定子は、::とその左側の型または名前空間を参照しています。stdは型ではなく、はるかに依存性の低い型です)

関連する問題