ฉันมีรหัสต่อไปนี้:
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;
}
เมื่อมีการสร้างนี้มีทั้ง GCC 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
มันจะไม่ขึ้นอยู่กับว่าหากไม่ใช่เพราะพวกเขาเป็นสมาชิกของอินสแตนซ์ปัจจุบัน