2017-04-04 9 views
10

हाल ही में मेरी कंपनी में हम एक त्रुटि में भाग गए कि मुझे समझ में आ रहा है कि यह वास्तव में एक त्रुटि क्यों है। हमारे लिए ऐसा लगता है कि यह ठीक से संकलित होना चाहिए और हमें टाइप बार :: 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; 
} 

क्या यहाँ पर जा रहा पर कोई भी विचार में है?

+0

क्या ऊपर सूचीबद्ध संकलक संस्करणों का उपयोग करने की आवश्यकता है? यदि नहीं, तो आप उपरोक्त सूचीबद्ध कोड का मूल्यांकन https://godbolt.org पर कर सकते हैं और उत्पन्न कोड देखने के लिए विभिन्न कंपाइलर्स का उपयोग कर सकते हैं। – AhiyaHiya

+0

आपका पोस्ट कोड 'cstdio' और' algorithm' से 'std :: remove' के समान नहीं है। यदि आप शुरू करने के लिए 'int foo (int) 'to bar' जोड़ते हैं, तो [ideone.com] (http://ideone.com/40xVXX) पर कोई समस्या नहीं है। –

+3

प्रश्न बनी हुई है: उपर्युक्त कोड कानूनी है? यदि ऐसा है, तो हमने जीसीसी में एक बग की पहचान की। यदि नहीं, तो मानक के साथ एक मुद्दा है। – jlehrer

उत्तर

4

ऐसा लगता है कि इस an ancient bug in gcc, जहां आप स्पष्ट रूप से ns::func का उपयोग करके एक टेम्पलेट का दृष्टांत नहीं कर सकते से संबंधित है, एक ही रास्ता namespace ns { ... func; } का उपयोग कर यह करने के लिए किया गया था। यह हाल ही में तय किया गया था और newer gcc your code will compile के साथ।

और वैसे, आप जो कह रहे हैं उसके विपरीत, आपका कोड compiles with clang 3.7

+0

क्या आप मुझे बता सकते हैं कि एक विशेषज्ञता को आगे घोषित किया जा रहा है? स्पष्ट तत्कालताओं को विशेषज्ञता माना जाता है? – jlehrer

+0

@jlehrer हाँ, आप सही हैं। जीसीसी में उस बग में हालांकि उस तरह के 'एनएस :: func' शब्द से संबंधित कई मुद्दे थे – Pavel

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