c++ - software - कन्स्ट्रक्टर टेम्पलेट तर्क क्यों कम नहीं कर सकते?



c++ software (3)

इस प्रश्न का उत्तर यहां दिया गया है:

template< class T >
class Foo {
public:
  Foo( T t ) { }
};

int main () {
  int i = 0;
  Foo f( i );
}

उपर्युक्त कोड में, संकलक शिकायत करता है कि 'f' से पहले टेम्पलेट तर्क गुम हैं। मैं समझता हूं कि कन्स्ट्रक्टर को तर्क से कक्षा के लिए टेम्पलेट तर्कों को कम करना मानक का हिस्सा नहीं है, लेकिन मेरा सवाल यह है कि क्यों? क्या कंपाइलर में ऐसी सभी जानकारी नहीं है जो इसे Foo<int> तुरंत चालू करने और उसके कन्स्ट्रक्टर को कॉल करने की आवश्यकता हो?

इसे स्पष्ट करने के लिए संपादित किया गया है कि मैं एक int साथ कन्स्ट्रक्टर को बुला रहा हूं (जैसा कि एक short , long , void* , आदि के विपरीत)

https://src-bin.com


Answer #1

क्योंकि किसी ने यह निर्दिष्ट नहीं किया है कि यह वास्तव में कैसे काम करता है। इसे मानक बनाने के लिए मानक समिति का एक वर्तमान प्रस्ताव है। इसमें कुछ कठिनाइयों को भी सूचीबद्ध किया गया है:

http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4471.html

अद्यतन: प्रस्ताव का नवीनतम संस्करण यहां दिया गया है:

http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0091r0.html


Answer #2

जिस वर्ग को आप तत्काल करना चाहते हैं उसका नाम Foo<int> (जैसा कि आप इंगित करते हैं) है।

Foo<short> f(0) , या Foo<unsigned long> f(0) , या Foo<Foo<double>*> f(0) लिखना भी संभव है। हालांकि, उन मामलों में, यदि आप केवल Foo f(0) लिखते हैं, तो आप संकलक को इस प्रकार का अनुमान लगाने में सक्षम होने की उम्मीद नहीं करते हैं।

कोई कल्पना कर सकता है कि कुछ तरीकों से कुछ ऐसे अनुमान लगाने के लिए नियमों के साथ एक सी ++ निर्दिष्ट किया जा सकता था (जैसे, शाब्दिक 0 अर्थ टाइप पैरामीटर int और कोई अन्य नहीं), लेकिन फिर भाषा अब उससे कहीं अधिक जटिल होगी और लोगों को प्रोग्रामिंग त्रुटियों के लिए अतिरिक्त तरीके होंगे। वास्तव में इस तरह की घोषणा में आपका क्या मतलब है लिखना ऐसा लगता है कि पूछने के लिए बहुत कुछ नहीं है।

संपादित करें: इसे पोस्ट करने के बाद, मैंने एक और जवाब में देखा कि सी ++ की ऐसी सुविधा बनाने का एक प्रस्ताव है, जैसा कि कोई कल्पना कर सकता है।


Answer #3

Foo एक वर्ग टेम्पलेट है , कक्षा नहीं। सही प्रकार के साथ उत्पन्न होने के लिए कक्षा के लिए इसके प्रकार को किसी भी तरीके से या किसी अन्य तरीके से आपूर्ति करने की आवश्यकता होती है। आप Foo नहीं कर सकते क्योंकि Foo एक प्रकार नहीं है, लेकिन Foo<int> है। यह इस तरह की एक कक्षा बनाता है:

class Foo {
public:
  Foo( int t ) { }
};

यदि आपने केवल Foo की आपूर्ति की है, तो संकलक वर्ग को उत्पन्न करने के बारे में नहीं जानता। Foo<int> f(0) काम करता है क्योंकि Foo<int> कक्षा उत्पन्न करता है, int साथ T को प्रतिस्थापित करता है। जिस प्रकार से आप कन्स्ट्रक्टर को कॉल करते हैं, संकलक पहले ही जानता है कि कन्स्ट्रक्टर एक int स्वीकार कर रहा है।





c++