2016-11-23 102 views
5

a.hpp我定義:C++依賴名稱:是否需要此類型名稱?

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

然後,在b.cpp我定義:

#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沒有任何警告進行編譯。 但是,Clion 2016.3在b.cpp中抱怨cannot resolve variable GroupNode。取消註釋typename可能會馴服Clion警告,但我想知道是否需要此typename?如果是這樣,爲什麼g ++/clang ++沒有發出任何警告?

回答

5

不,這不是必需的。根據[temp.res]/3在C++ 14:

合格-ID是指一種類型的不屬於當前實例中的一員(14.6.2.1) 其嵌套名稱說明符涉及依賴類型,它應以關鍵字typename爲前綴,形成 a 類型名稱說明符。如果合格代碼中的類型名稱說明符不表示類型,則程序形成。

這裏沒有嵌套名稱說明符參照一個依賴型,所以typename不是必需的。 (嵌套名稱說明符指的是::及其左側的類型或名稱空間。很明顯,std不是一種類型,更不用說依賴類型。)