2016-09-07 4 views
6

निम्न उदाहरण लें:जी ++ - छाया टेम्पलेट मानकों के आधार पर 6 त्रुटियों जबकि जी ++ - 5 नहीं है

g++-6 के साथ संकलित करने के लिए विफल रहता है है:

#include <vector> 

template <typename T, template <class T> class Container> 
std::vector<T> To_Vector(Container<T> const& c){ 
    return std::vector<T>(c.begin(), c.end()); 
} 

int main(){} 
g++-5 साथ

, यह त्रुटियों के बिना संकलित :

g++-6 -o main main.cpp 
main.cpp:4:33: error: declaration of template parameter ‘T’ shadows template parameter 
template <typename T, template <class T> class Container> 
           ^~~~~ 
main.cpp:4:11: note: template parameter ‘T’ declared here 
template <typename T, template <class T> class Container> 

क्या संकलक गलत है? क्या मेरा कोड गलत है?
क्यों g++-5 इस कोड जबकि g++-6 नहीं है संकलित करता है?


g++-5 --version  
g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

g++-6 --version 
g++-6 (Ubuntu 6.2.0-3ubuntu11~14.04) 6.2.0 20160901 
Copyright (C) 2016 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

@skypjack ठीक है, तो मैं बाहर 'टी' में छोड़ देना चाहिए, क्योंकि सिर्फ मेरे लिए बनाता है। –

+0

यह एक वैध और कामकाजी समाधान है। वह 'टी' आपके उदाहरण में बेकार है, है ना? – skypjack

+0

@skypjack आप सही हैं। मैं यह सोच कर कि कंटेनर प्रकार का नाम पर प्रकार टी विशेष किया जा सकता था में भ्रमित करना चाहिए किया गया है, लेकिन यह है कि वास्तविक मानकों के आधार पर होता है। –

उत्तर

4

जी के व्यवहार ++ 6 सही है क्योंकि मानक के अनुसार:

एक टेम्पलेट पैरामीटर अपने दायरे के भीतर redeclared नहीं किया जाएगा (नेस्टेड स्कॉप्स समेत)। एक टेम्पलेट पैरामीटर टेम्पलेट नाम के रूप में एक ही नाम नहीं होगा।

T के दायरे, सही अपनी घोषणा के बाद शुरू होता है, तो यह निम्न टेम्पलेट टेम्पलेट पैरामीटर है, जो एक टेम्पलेट पैरामीटर के रूप में T redeclares में फैली हुई है, इसलिए इस नियम का उल्लंघन किया है।

मुझे लगता है कि जी ++ 5 और जी ++ 6 के बीच का परिवर्तन इसी तरह की समस्या के आसपास कुछ बग रिपोर्ट को ठीक करने के कारण था।

+0

इसके बजाय यह क्यों काम करता है? 'टेम्पलेट <टेम्पलेट वर्ग कंटेनर, typename टी> '। क्या वे अलग-अलग स्कोप अलग-अलग पैरामीटर सूचियों का हिस्सा हैं? – skypjack

+0

@skypjack पहले 'टी' का दायरा टेम्पलेट पैरामीटर सूची के बाकी हिस्सों तक विस्तारित नहीं होता है, इसलिए दूसरा' टी' इसे छिपा नहीं देता है। – Brian