कृपया, देखें कि मैं क्या करने की कोशिश कर रहा हूं:टेम्पलेट विशेषज्ञता को अलग-अलग नामस्थानों में क्यों नहीं रखा जाता है?
#include <iostream>
namespace first
{
template <class T>
class myclass
{
T t;
public:
void who_are_you() const
{ std::cout << "first::myclass"; }
};
}
namespace second
{
using first::myclass;
template <>
class myclass <int>
{
int i, j;
public:
void who_are_you() const
{ std::cout << "second::myclass"; }
};
}
इसकी अनुमति नहीं है। क्या आप कृपया को स्पष्ट कर सकते हैं क्यों विशेषज्ञता नामांकन अलग-अलग नामस्थानों में नहीं हो सकता है, और उपलब्ध समाधान क्या हैं? साथ ही, क्या यह सी ++ 0x में कुछ तय है?
यह std::max
, std::swap
, std::numeric_limits
, आदि को विशेषज्ञता देने के लिए उदाहरण के लिए मुझे अनुमति देगा .. ::std::
में कुछ जोड़कर अपरिभाषित व्यवहार का उपयोग किए बिना?
@AndreyT यह है कि मैं इसे कैसे उपयोग करूंगा:
// my_integer is a class
std::numeric_limits<my_integer>::max(); // specialized std::numeric_limits for my_integer
क्या यह किया जा सकता है?
एक विकल्प के रूप में, क्या आप एक नया टेम्पलेट नहीं बना सकते जो मानक से प्राप्त होता है? – Cogwheel
प्रति §17.4.3.1/1: "कोई प्रोग्राम किसी भी मानक लाइब्रेरी टेम्पलेट के लिए नामस्थान std में टेम्पलेट विशेषज्ञता जोड़ सकता है। एक मानक लाइब्रेरी टेम्पलेट के इस तरह की विशेषज्ञता (पूर्ण या आंशिक) अपरिभाषित व्यवहार में परिणाम जब तक कि घोषणा उपयोगकर्ता पर निर्भर न हो - बाह्य संबंध का निर्धारित नाम और जब तक कि मूल मूल टेम्पलेट के लिए विशेषज्ञता मानक पुस्तकालय आवश्यकताओं को पूरा न करे। " इसलिए प्रतिबंध होने पर, आप सही परिस्थितियों में ':: std ::' में ऐसी विशेषज्ञता जोड़ सकते हैं। –
@ जेरी कॉफिन मैंने सोचा कि कुछ भी जोड़ने से एक अपरिभाषित व्यवहार होगा! कृपया इन आवश्यकताओं को पूरा करने के तरीके को समझाते हुए एक उत्तर प्रदान करेंगे? – AraK