2014-10-25 8 views
5

निम्नलिखित कोड बजना के साथ सफलतापूर्वक संकलित 3.5.0 और जी ++ 4.9.0C++03 (flag -std=C++03) के तहत, C++11 (flag -std=C++11), और C++14 (flag -std=C++14) (-Wall -Wextra -pedantic-errors झंडे के साथ): यह अतिरिक्त typename कीवर्ड जोड़ने के लिए मान्यटेम्पलेट पैरामीटर सूची में अतिरिक्त टाइपनाम कीवर्ड: क्या यह मान्य है या नहीं?

namespace N 
{ 
    typedef int T; 

    enum E{}; 
} 

template <typename N::T> 
struct ST{}; 

template <typename N::E> 
struct SE{}; 

int main() 
{ 
} 

है गैर-प्रकार टेम्पलेट पैरामीटर घोषणा से पहले?


ध्यान दें कि निम्नलिखित कोड संकलन नहीं करता है (C++03, C++11, और C++14 कोड के रूप में):

typedef int T; 

enum E{}; 

template <typename T t> 
struct ST{}; 

template <typename E e> 
struct SE{}; 

int main() 
{ 
} 

लेकिन बाद एक फिर से ठीक संकलित (C++03, C++11, और C++14) :

typedef int T; 

enum E{}; 

template <typename ::T> 
struct ST{}; 

template <typename ::E> 
struct SE{}; 

int main() 
{ 
} 
+0

मुझे संदेह है कि 'टाइपनाम एन :: टी' को एक प्रकार पैरामीटर के रूप में पार्स किया जाता है, जो वास्तविक प्रकार 'एन :: टी' से संबंधित नहीं है। हालांकि, इसका नाम अजीब है। – leemes

+0

@dyp और आपके उद्धरण से क्या पालन करना चाहिए? – Constructor

+0

@leemes हाँ, मुझे ऐसा भी लगता है। और यह * बहुत * अजीब है। – Constructor

उत्तर

6

इसकी अनुमति है, लेकिन केवल योग्य नामों के साथ:

typename-विनिर्देशक:
                  typenameनेस्टेड-नाम-विनिर्देशक पहचानकर्ता
                    typenameनेस्टेड-नाम-विनिर्देशक template ऑप्ट सरल-टेम्पलेट आईडी

तो typename E व्याकरण के अनुसार गलत है। typename N::E नाम से योग्य नहीं है। तीसरा मामला, typename ::E, ठीक है :: एक मान्य नेस्टेड-नाम-विनिर्देशक है।

[temp.res] में सी ++ 03 मानक निर्दिष्ट/5 कि

कीवर्ड typename योग्य नाम के लिए ही लागू किया जाएगा, लेकिन उन नामों निर्भर होने की ज़रूरत नहीं।

सी ++ 11 मानक कहता है कि यह कहीं नहीं स्पष्ट रूप से लेकिन [temp.names] में एक नोट के अंदर/5:

[नोट:typename उपसर्ग के साथ मामला है, template उन मामलों में उपसर्ग की अनुमति है जहां यह सख्ती से आवश्यक नहीं है; अर्थात।, जब नेस्टेड-नाम-विनिर्देशक या -> या . के बाईं पर अभिव्यक्ति एक टेम्पलेट के दायरे में प्रकट नहीं होता है एक टेम्पलेट पैरामीटर, या उपयोग पर निर्भर नहीं है। - अंत टिप्पणी]

एक ही नोट सी ++ 14 मानक में ठीक उसी जगह में मौजूद है।

+0

तो यदि नाम निर्भर नहीं है तो 'टाइपनाम' अनिवार्य है? – 0x499602D2

+0

@ 0x499602D2 हां। 'टाइपनाम' असंबद्धता के लिए है; अगर असंबद्धता की कोई आवश्यकता नहीं है, तो 'टाइपनाम' की आवश्यकता नहीं है;) – dyp

+0

@ 0x499602D2 निश्चित रूप से। – Columbo

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