मेरे पास निम्नलिखित कोड हैं:
template <typename TC>
class C
{
struct S
{
template <typename TS>
void fun() const
{}
};
void f(const S& s)
{
s.fun<int>();
}
};
// Dummy main function
int main()
{
return 0;
}
जब इसे जीसी 9.2 और क्लैंग (9.0) दोनों के साथ बनाया जाता है, तो मुझे template
कीवर्ड को इनवॉइस करने के लिए आवश्यक संकलन त्रुटि मिल रही है fun
। क्लेंग शो:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
मुझे समझ में नहीं आता है कि संकलक fun
के संदर्भ में एक आश्रित नाम क्यों है f
, क्योंकि f
यह एक टेम्पलेट नहीं है। यदि मैं C
टेम्पलेट के बजाय एक नियमित वर्ग में बदल जाता हूं , तो त्रुटि दूर हो जाती है; हालाँकि, मैं नहीं देखता कि क्यों न तो पहली जगह में कोई त्रुटि हो S
और न ही f
निर्भर हो TC
।
ताज्जुब है, MSVC 19.22 यह सिर्फ ठीक संकलित करता है।
ध्यान दें
मतदान करने से पहले, मुझे कहां और क्यों "टेम्पलेट" और "टाइपनेम" कीवर्ड डालना है? कृपया विचार करें कि यह एक विशेष मामला है, भले ही S
वास्तव में एक आश्रित नाम हो, इस संदर्भ में f
निर्भर नहीं होगा यदि इस तथ्य के लिए नहीं कि वे वर्तमान तात्कालिकता के सदस्य हैं।