निम्नलिखित वर्ग टेम्पलेट को देखते हुए:
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
यदि आप इसकी परिभाषा को हटाते हैं तो स्पष्ट रूप से (सही ढंग से) एक अपूर्ण प्रकार होगा।