हाल ही में मेरी कंपनी में हम एक त्रुटि में भाग गए कि मुझे समझ में आ रहा है कि यह वास्तव में एक त्रुटि क्यों है। हमारे लिए ऐसा लगता है कि यह ठीक से संकलित होना चाहिए और हमें टाइप बार :: foo के टेम्पलेट को स्पष्ट रूप से तत्काल करने की अनुमति देता है।मैन्युअल रूप से टेम्पलेट को तुरंत चालू करने में त्रुटि
mainy.cxx
int foo(int);
namespace bar {
template <typename T> T foo(T a, T){return a;}
}
namespace bar {
using ::foo;
}
template int bar::foo(int, int);
int main(){
return 0;
}
जी ++ त्रुटि
[[email protected]:~/test]1047 $ g++ mainy.cxx
mainy.cxx:10: error: 'int bar::foo(int, int)' should have been declared inside 'bar'
mainy.cxx:10: error: 'int bar::foo(int, int)' is not declared in '::'
हम पुष्टि की है कि यह यह दृश्य के साथ काम करने के लिए प्रकट तथापि जीसीसी 4.8, 4.4 और 3.7 बजना में कोई त्रुटि है स्टूडियो 2015.
हम इस समस्या में भाग गए जब हमनेको तुरंत चालू करने का प्रयास कियालेकिन <algorithm>
<cstdio>
से पहले शामिल किया था और <cstdio>
यह
namespace std {
using ::remove;
}
क्या यहाँ पर जा रहा पर कोई भी विचार में है?
क्या ऊपर सूचीबद्ध संकलक संस्करणों का उपयोग करने की आवश्यकता है? यदि नहीं, तो आप उपरोक्त सूचीबद्ध कोड का मूल्यांकन https://godbolt.org पर कर सकते हैं और उत्पन्न कोड देखने के लिए विभिन्न कंपाइलर्स का उपयोग कर सकते हैं। – AhiyaHiya
आपका पोस्ट कोड 'cstdio' और' algorithm' से 'std :: remove' के समान नहीं है। यदि आप शुरू करने के लिए 'int foo (int) 'to bar' जोड़ते हैं, तो [ideone.com] (http://ideone.com/40xVXX) पर कोई समस्या नहीं है। –
प्रश्न बनी हुई है: उपर्युक्त कोड कानूनी है? यदि ऐसा है, तो हमने जीसीसी में एक बग की पहचान की। यदि नहीं, तो मानक के साथ एक मुद्दा है। – jlehrer