निम्नलिखित वर्ग टेम्पलेट को देखते हुए:
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
{
}
जीसीसी और एमएसवीसी दोनों प्रारंभिक कोड को स्वीकार करते हैं, जो प्रश्न पूछते हैं; क्या यह एक क्लैंग बग है या क्या यह तीनों में से एकमात्र अनुरूप कार्यान्वयन है?
Innerहैं और प्रत्येक विशेषज्ञता के लिए अलग-अलग परिभाषित fकरते हुए संकलन त्रुटि को हल करते हैं।
Innerप्रत्येक विशेषज्ञता के लिए परिभाषाओं के बावजूद एक अपूर्ण प्रकार के रूप में रिपोर्ट किया Outerजा रहा है। Innerयदि आप इसकी परिभाषा को हटाते हैं तो स्पष्ट रूप से (सही ढंग से) एक अपूर्ण प्रकार होगा।