कारण यह है कि जब एक वर्ग टेम्पलेट instantiating, सभी अपनी घोषणाओं (नहीं परिभाषाएं) इसके सदस्य कार्यों के भी तत्काल हैं। कक्षा टेम्पलेट को तुरंत ठीक किया जाता है जब विशेषज्ञता की पूर्ण परिभाषा की आवश्यकता होती है। यही वह मामला है जब इसे बेस क्लास के रूप में उपयोग किया जाता है, उदाहरण के लिए, जैसा कि आपके मामले में है।
तो क्या होता है और इस बिंदु पर B
नहीं एक पूर्ण प्रकार है अभी तक (यह वर्ग परिभाषा के समापन ब्रेस के बाद है) कि A<B>
class B : public A<B>
पर instantiated जाता है। हालांकि, A<B>::action
की घोषणा, B
की आवश्यकता है पूरा हो सकता है क्योंकि यह यह के दायरे में क्रॉल कर रहा है:
Subclass::mytype
आप क्या करना कुछ बिंदु B
पूरा हो गया है, जिस पर करने के लिए इन्स्टेन्शियशन में देरी कर रहा है की जरूरत है। ऐसा करने का एक तरीका यह है कि इसे सदस्य टेम्पलेट बनाने के लिए action
की घोषणा को संशोधित करना है।
template<typename T>
void action(T var) {
(static_cast<Subclass*>(this))->do_action(var);
}
यह अभी भी टाइप-सुरक्षित है, क्योंकि var
, सही प्रकार का नहीं है var
do_action
को गुजर विफल हो जाएगा।
स्रोत
2009-03-16 21:36:47
मैं अपने कोड के थोड़े पुनर्गठन के लिए बस गया (कुछ अन्य संबंधित मुद्दों के कारण मैंने यहां वर्णन नहीं किया) लेकिन मैंने इस दृष्टिकोण का परीक्षण किया और यह वास्तव में समस्या को ठीक करता है। धन्यवाद! – seanhodges