ओवरलोड के बाद 2 पर विचार करें
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
1 वाला नियमित कक्षाओं के लिए काम करता है, जबकि दूसरा एक ऐसे टेम्प्लेट्स के लिए काम करता है जो तात्कालिक नहीं हैं। उदाहरण के लिए:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
अब निम्नलिखित टेम्पलेट फ़ंक्शन पर विचार करें:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
जीसीसी में यह अस्पष्ट अधिभार संकल्प के लिए एक त्रुटि देता है, जबकि क्लैंग संकलन करता है। दिलचस्प बात यह है कि परीक्षण के लिए दूसरा कॉल () जीसीसी (यहां तक कि) में भी त्रुटि पैदा नहीं करता है। इसके अलावा, अगर मैं template<typename U>
टेम्पलफुन के ऊपर की चीज को हटाता हूं, तो जीसीसी शिकायत करना बंद कर देता है।
क्या यह जीसीसी के साथ एक बग है या यह अवैध कोड है?