यह जीसीसी 4.4 के साथ संकलित करने में विफल क्यों होता है?नामस्थानों में फ़ंक्शन टेम्पलेट्स ओवरलोडिंग
template<typename T>
class A {
public:
void foo() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (A<T> a) {
a.foo();
}
};
template<typename T>
void myfun (T x) {
Ns::do_it (x);
}
template<typename T>
class B {
public:
void bar() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (B<T> b) {
b.bar();
}
};
int main() {
A<int> a;
B<int> b;
myfun (a);
myfun (b); // error: no matching function call to do_it(B<int>&)
return 0;
}
यह do_it
का नाम स्थान के साथ कुछ होना आवश्यक है। जब मैं इसके आस-पास नामस्थान हटा देता हूं, तो यह संकलित होता है।
पृष्ठभूमि: मैं फ़ंक्शंस का एक सेट बना रहा हूं जिसका उपयोग कई अलग-अलग कंटेनर वर्गों के साथ किया जा सकता है। अलग-अलग इंटरफ़ेस को समान रूप से संभालने के लिए मैं फ्रीस्टैंडिंग फ़ंक्शंस का उपयोग करता हूं जो प्रत्येक कंटेनर कक्षाओं के लिए अधिभारित होते हैं। उनके साथ वैश्विक नामस्थान को छेड़छाड़ से बचने के लिए इन कार्यों को नामस्थान में रखा जाएगा।
बी के लिए परिभाषाओं को ए के लिए अलग-अलग शीर्षलेख फ़ाइल से आने के बारे में सोचा जाएगा, इसलिए एक पुनर्वितरण एक विकल्प नहीं है।
यह एक टाइपो है! HTML द्वारा निगल लिया गया था। –
वीएस 2010 उपर्युक्त कोड संकलित करता है, और मेरा मानना है कि ऐसा करने में यह सही है, लेकिन यह एक मुश्किल उदाहरण है। अच्छा प्रश्न! –
वीएस -2008 के साथ ही, मैंने अभी इसे चेक किया है। क्या यह जीसीसी में एक बग हो सकता है या उनकी व्याख्या माइक्रोसॉफ्ट से अलग है? तथ्य यह है कि यह नामस्थान के बिना काम करता है यह एक बग होने के लिए इंगित करेगा, है ना? –