2016-07-27 14 views
12

इस उदाहरण पर विचार:क्या 'बेस :: ऑपरेटर टी` का उपयोग कर रहा है जहां `टी` टेम्पलेट प्रकार पैरामीटर है?

struct B { operator int(); }; 

template<class T> 
struct X:B 
{ 
    using B::operator T; 
}; 

GCC, कोड को स्वीकार करता है, जबकि Clang और MSVC यह खारिज कर दिया। कौन सा सही है?

ध्यान दें कि अगर आधार प्रकार निर्भर है, सभी compilers कोड स्वीकार करते हैं:

template<class T> 
struct B { operator T(); }; 

template<class T> 
struct X:B<T> 
{ 
    using B<T>::operator T; 
}; 
+1

यदि आप 'बी' में 'ऑपरेटर int() 'को एक टेम्पलेटेड रूपांतरण फ़ंक्शन (उदाहरण के लिए' टेम्पलेट ऑपरेटर टी(); ') करते हैं, तो यह काम करता है, और यदि आप इसे' int 'के लिए विशेषज्ञ करते हैं, तो यह भी काम करता है और कॉल करता है विशेषज्ञता जहां तक ​​मैं समझता हूं, मानक इसे मना करता है (* "चूंकि रूपांतरण कार्यों के लिए सदस्य टेम्पलेट्स की विशेषज्ञताएं नाम लुकअप, द्वारा नहीं मिलती हैं, इसलिए इन्हें तब नहीं माना जाता है जब उपयोग-घोषणा एक रूपांतरण फ़ंक्शन निर्दिष्ट करती है (14.5.2) । "*)। इसके अलावा, अगर आप इसे सदस्य फ़ंक्शन में कॉल करते हैं तो क्लैंग 'ऑपरेटर टी' ढूंढने में सक्षम है, इसलिए मुझे लगता है कि जीसीसी सही है। – Holt

उत्तर

3

मुझे लगता है कि जीसीसी सही है,, हम पा सकते हैं:: यह जीसीसी में संकलित करता है नहीं (5.3.0)

द्वारा शुरू की गई घोषणाओं के सेट उपयोग-घोषणा में नाम के लिए योग्य नाम लुकअप (3.4.3, 10.2) प्रदर्शन करके, नीचे वर्णित कार्यों को छोड़कर, घोषणा-घोषणा की जाती है।

template<class T> 
struct X: B { 
    T f() { return B::operator T; } 
}; 

... जी के साथ ठीक संकलित ++ और बजना (MSVC पर परीक्षण नहीं किया है):

मैं किसी भी कारण है कि operator T नहीं मिला होगा, वास्तव में नहीं दिख रहा है।

मैं छोड़कर योग्य नाम देखने functionsfor रूपांतरण के लिए मानक विशिष्ट में कुछ भी नहीं मिल सकता है:

के बाद से रूपांतरण कार्यों के लिए सदस्य टेम्पलेट्स के विशेषज्ञताओं नाम देखने से नहीं पाए जाते हैं, वे नहीं माना जाता है जब एक का उपयोग कर-घोषणा रूपांतरण फ़ंक्शन निर्दिष्ट करता है (14.5.2)।

लेकिन B::operator int एक सदस्य समारोह टेम्पलेट की एक विशेषज्ञता नहीं है, तो यह ऊपर से ध्यान में नहीं रखा जाना चाहिए।

-1

हम्म ... जीसीसी या तो पहले एक पसंद नहीं है। यह संकलित करता है जब तक आप के उदाहरण को int के अलावा टेम्पलेट पैरामीटर के साथ बनाने का प्रयास नहीं करते हैं। X<double>::operator double() का अर्थ क्या होगा? कक्षा बी में ऐसा ऑपरेटर नहीं है लेकिन हम इसका उपयोग करने की कोशिश करेंगे।

समेकित करने के लिए: एमएसवीसी और क्लैंग आपको पहले चेतावनी देने का प्रयास करते हैं (भले ही आप कुछ भी बेवकूफ बेवकूफ नहीं करते हैं), जबकि जीसीसी केवल कुछ गलत बनाने का प्रयास करते समय त्रुटि उत्पन्न करता है। § 7.3.3/1 में

#include <iostream> 

struct B { operator int(); }; 

template<class T> 
struct X:B 
{ 
    using B::operator T; 
}; 

int main(int argc, char **argv) 
{ 
    X<char> x; 
    std::cout << "Hello!" << std::endl; 
    return 0; 
} 
+0

'एक्स एक्स; 'से' एक्स एक्स; '..........;) – 101010

+0

इसका मतलब यह नहीं है कि जीसीसी गलत है। यदि आप रूपांतरण ऑपरेटर को 'बी' में टेम्पलेट करते हैं, और आप इसे' int' के लिए विशेषज्ञ बनाते हैं, तो सभी कंपाइलर्स खुश होंगे, लेकिन आपका प्रोग्राम किसी भी प्रकार के 'इंटी' (किसी भी कंपाइलर के साथ) संकलित नहीं करेगा (लिंकेज में विफल रहता है))। – Holt

+0

@ 101010 यह वही है जो मैंने लिखा है: _ यह तब तक संकलित नहीं होता जब तक आप 'int'._ – Lehu

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