मेरी लाइब्रेरी में कॉन्स्ट और गैर-कॉन्स्ट टेम्पलेट तर्कों के लिए फ़ंक्शंस प्रदान करने का प्रयास करते समय मुझे एक अजीब समस्या आई।अपरिभाषित टेम्पलेट 'वर्ग' के निहित तत्कालता
#include <iostream>
template<typename some_type>
struct some_meta_class;
template<>
struct some_meta_class<int>
{
typedef void type;
};
template<typename some_type>
struct return_type
{
typedef typename some_meta_class<some_type>::type test;
typedef void type;
};
template<typename type>
typename return_type<type>::type foo(type & in)
{
std::cout << "non-const" << std::endl;
}
template<typename type>
void foo(type const & in)
{
std::cout << "const" << std::endl;
}
int main()
{
int i;
int const & ciref = i;
foo(ciref);
}
मैं एक गैर स्थिरांक संस्करण और foo के लिए एक स्थिरांक संस्करण लेकिन दुर्भाग्य से इस कोड को लागू करने के लिए बजना 3.0 और जीसीसी 4.6.3 पर संकलन नहीं होगा की कोशिश की: निम्नलिखित स्रोत कोड एक न्यूनतम उदाहरण घटना है।
main.cpp:18:22: error: implicit instantiation of undefined template 'some_meta_class'
तो किसी कारण से संकलक एक कॉन्स इंट-रेफरेंस के लिए foo के गैर-कॉन्स संस्करण का उपयोग करना चाहता है। यह स्पष्ट रूप से ऊपर की त्रुटि की ओर जाता है क्योंकि some_meta_class के लिए कोई कार्यान्वयन नहीं है। अजीब बात यह है कि यदि आप निम्न परिवर्तन से कोई एक कार्य, कोड अच्छी तरह से संकलित, और काम करता है:
- टिप्पणी हटाएं/गैर-स्थिरांक संस्करण को निकालने
- uncomemnt/return_type की typedef :: परीक्षण को दूर
यह उदाहरण निश्चित रूप से सरल और शुद्ध अकादमिक है। मेरी लाइब्रेरी में मैं इस समस्या से आया क्योंकि कॉन्स और गैर-कॉन्स संस्करण अलग-अलग प्रकार लौटता है। मैंने इस समस्या को एक सहायक वर्ग का उपयोग करके प्रबंधित किया जो आंशिक रूप से विशिष्ट है।
लेकिन उपर्युक्त उदाहरण इस तरह के अजीब व्यवहार में क्यों परिणाम देता है? संकलक गैर-कॉन्स संस्करण का उपयोग क्यों नहीं करना चाहता जहां कॉन्स्ट संस्करण मान्य है और बेहतर मिलान करता है?
वर्तमान में यह संभव वैध अधिभारों की एक सूची उत्पन्न करने के चरण में है, और चूंकि यह वापसी_type को ठीक से ठीक नहीं कर सकता है, यह वहां से बाहर निकलता है (मेरा मतलब देखने के लिए return_type में परीक्षण के टाइपपीफ पर टिप्पणी करें) –
PlasmaHH