2016-11-23 7 views
5

a.hpp में मैं परिभाषित:सी ++ आश्रित नाम: क्या इस टाइपनाम की आवश्यकता है?

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

ऊपर कोड दोनों जीसीसी -6 और बजना-3.9 किसी चेतावनी के बिना पर संकलित किया जा सकता है। हालांकि, क्लियन 2016.3 ने b.cpp में cannot resolve variable GroupNode की शिकायत की। typename अनमोलमेंटिंग क्लियन चेतावनी को रोक सकती है, लेकिन मैं सोच रहा था कि यह typename आवश्यक है? यदि हां, तो क्यों g ++/clang ++ ने कोई चेतावनी नहीं दी?

उत्तर

5

नहीं, इसकी आवश्यकता नहीं है। सी ++ 14 में [temp.res]/3 के अनुसार:

जब एक योग्य-आईडी एक प्रकार है कि वर्तमान इन्स्टेन्शियशन का सदस्य नहीं है का उल्लेख करने का इरादा है (14.6.2.1) और इसकी नेस्टेड-नाम-विनिर्देशक एक आश्रित प्रकार को संदर्भित करता है, इसे typename कीवर्ड से पूर्ववर्ती किया जाएगा, टाइपनाम-निर्दिष्ट बना रहा है। योग्य-आईडीटाइपनाम-विनिर्देशक किसी प्रकार को इंगित नहीं करता है, तो प्रोग्राम बीमार है- गठित।

यहाँ कोई नेस्टेड-नाम-विनिर्देशक एक आश्रित प्रकार की चर्चा करते हुए, तो typename आवश्यकता नहीं है। (नेस्टेड-नाम-विनिर्देशक:: और उसके बाएं प्रकार या नामस्थान को संदर्भित करता है। स्पष्ट रूप से, std एक प्रकार नहीं है, बहुत कम निर्भर प्रकार है।)

संबंधित मुद्दे