รับแม่แบบชั้นเรียนต่อไปนี้:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
เรากำหนดInner
แยกต่างหากสำหรับแต่ละความเชี่ยวชาญของOuter
:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
จากนั้นกำหนดฟังก์ชันสมาชิกf
หนึ่งครั้งสำหรับความเชี่ยวชาญพิเศษทั้งหมดของOuter
:
auto Outer<T>::f(Inner) -> void
{
}
แต่เสียงดังกราว (9.0.0) บ่น:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
เราสามารถหลบเลี่ยงข้อผิดพลาดของคอมไพเลอร์โดยให้คำจำกัดความของInner
ความเชี่ยวชาญอื่น ๆ ของOuter
:
template<typename T>
struct Outer<T>::Inner {};
หรือโดยการf
แยกต่างหากสำหรับแต่ละความเชี่ยวชาญ:
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
ทั้ง GCC และ MSVC ยอมรับรหัสเริ่มต้นซึ่งทำให้เกิดคำถาม นี่เป็นข้อผิดพลาดของเสียงดังกราวหรือมันเป็นเพียงการนำไปปฏิบัติให้สอดคล้องกับสามข้อเท่านั้น?
Inner
ความเชี่ยวชาญพิเศษอื่น ๆและการf
แยกต่างหากสำหรับแต่ละความเชี่ยวชาญแก้ไขข้อผิดพลาดการรวบรวม
Inner
คือการรายงานว่าเป็นประเภทที่ไม่สมบูรณ์แม้จะมีคำจำกัดความสำหรับความเชี่ยวชาญเฉพาะด้านของOuter
การจัดเตรียม ชัดเจนว่าInner
จะเป็นประเภทที่ไม่สมบูรณ์หากคุณลบคำจำกัดความของมัน