मैं प्रभावी आधुनिक सी ++ के पेज 91 पर उदाहरण की पुष्टि करने के लिए झुका रहा था, और मैं एक अजीब मुद्दा प्रतीत होता हूं। इस कोड कोसी ++ अस्वीकरण घोषणा टेम्पलेट कटौती
template<typename C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
std::cout << "container version" << std::endl;
}
template<>
void doStuff<int>(int& x, int& y) noexcept {
std::cout << "int version" << std::endl;
}
int main() {
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {4, 5, 6};
int x = 5;
int y = 6;
doStuff(x, y);
doStuff(v1, v2);
}
मुझे
error: request for member ‘front’ in ‘a’, which is of non-class type ‘int’ void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
इसलिए, यह, doStuff के शीर्ष संस्करण बुलाया जा रहा है की तरह लगता है भी a.front हालांकि() और b.front की तरह एक त्रुटि देता है() होना चाहिए चींटियों के संदर्भ में वापसी। अगर मैं कोड से सभी अस्वीकार्य घोषणाओं को हटा देता हूं, तो मुझे अपेक्षित आउटपुट मिलता है।
यह जीसीसी 5.4 के साथ है।
मैं क्या गलत कर रहा हूं?
धन्यवाद
याद रखें कि टेम्पलेट्स एक compile.time विशेषता है। जब 'doStuff' फ़ंक्शन का पहला संस्करण परिभाषित किया गया है, तो कंपाइलर को' int' के लिए विशेषज्ञता के बारे में कुछ भी पता नहीं है। –
समस्या भी है कि 'doStuff' को घोषित नहीं किया गया है जब इसे पहले' अस्वीकरण 'विनिर्देशन में उपयोग किया जाता है। – aschepler