मैं स्पष्ट रूप से एक टेम्प्लेट फ़ंक्शन कैसे त्वरित कर सकता हूं?


117

मेरे पास एक तर्क के साथ एक टेम्पलेट फ़ंक्शन है। मुझे उस फ़ंक्शन को कॉल करने के बिना उस फ़ंक्शन को तुरंत करना होगा, इसका मतलब स्पष्ट रूप से मुझे तत्काल करना होगा।

मेरा यह कार्य है:

template <class T> int function_name(T a) {}

मैंने उस फंक्शन को इस तरह से इंस्टेंट किया:

template int function_name<int>(int);

लेकिन मुझे निम्नलिखित त्रुटियां मिलीं:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

जवाबों:


182

[संपादित २]] ध्यान दें कि कोड स्वरूपण मुद्दों के कारण मूल प्रश्न में कोड के बारे में कुछ भ्रम था। अधिक जानकारी के लिए एंथनीचैचिन्स का उत्तर देखें।

यदि आप वास्तव में फ़ंक्शन (विशेषज्ञ या कुछ के बजाय) को तुरंत करना चाहते हैं, तो यह करें:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[संपादित करें] स्पष्ट तात्कालिकता और विशेषज्ञता के संबंध में भ्रम की स्थिति (बहुत कुछ) प्रतीत होती है। ऊपर मैंने जो कोड पोस्ट किया है वह स्पष्ट तात्कालिकता से संबंधित हैविशेषज्ञता के लिए वाक्य रचना अलग है। यहाँ विशेषज्ञता के लिए वाक्य रचना है:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

टेम्पलेट के बाद कोण कोष्ठक पर ध्यान दें!


3
वह तात्कालिकता या विशेषज्ञता है ?
नवाज

5
सच नहीं। आप संकलक को स्पष्ट रूप से तात्कालिक टेम्पलेट्स को बता सकते हैं। अधिक विवरण के लिए "C ++ स्पष्ट टेम्पलेट तात्कालिकता" के लिए Google।
रोते हुए

8
@ नवाज़: आप गलत हैं। बेशक यह हमेशा कंपाइलर होता है जो इंस्टेंटिअट्स करता है, वह प्रोग्राम प्रोग्रामर से कंपाइलर से टेम्पलेट को इंस्टेंट करने के लिए एक रिक्वेस्ट है। यदि आपके पास C ++ मानक की एक प्रति है, तो 14.7.2 पढ़िए स्पष्ट तात्कालिकता
डेविड रॉड्रिग्ज़ - ड्रिबीस

16
विशेषज्ञता का मतलब है कि आप शायद इसके कार्यान्वयन को बदल रहे हैं। तात्कालिकता का मतलब है कि आप इसे एक विशेष संकलन इकाई को सौंप रहे हैं, संभवतः इसका अद्वितीय पता लेने के लिए या इसे लाइब्रेरी फ़ंक्शन के रूप में या ब्लोट को कम करने के लिए उपलब्ध कराएं।
कैशबैक

3
@hrnt: मुझे लगता है, तुम सही हो। @Ashot: मैंने अभी देखा है कि वाक्य रचना का template<>रूप नहीं है । उन्होंने जो लिखा है वह विशेषज्ञता से अलग है । इस नई चीज को सिखाने के लिए +1। मैं अपनी पोस्ट हटा रहा हूं। : डी
नवाज

20

आपका कोड सही है।

त्रुटि संदेश कोड में एक जगह से संबंधित है जिसे आपने यहां उद्धृत नहीं किया था।

अपडेट करें:

मूल कोड था

template <class T> int function_name(T a) {}
template int function_name<int>(int);

और यह सही था।

लेकिन यह उद्धृत नहीं किया गया था और इस तरह से देखा गया था :

template int function_name(T a) {}
template int function_name(int);

यह निम्न त्रुटि उत्पन्न करता है

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

जो कि ओपी के हवाले से स्पष्ट रूप से अलग है।

इस संस्करण में दूसरी पंक्ति ठीक है ( <int>यहां छोड़ा जा सकता है), लेकिन पहली पंक्ति दोषपूर्ण है। संकलक अनुमान नहीं लगा सकता है कि Tएक टेम्पलेट पैरामीटर है।


तकनीकी रूप से यह उनका कोड नहीं था, यह बिल का संपादन था :) मूल कोड है template int function_name( T a) { }औरtemplate int function_name(int);
13

@hrnt मूल कोड सही ढंग से स्वरूपित नहीं किया गया था, फिर भी यह सही था। अगर मैं बालाजी होता तो मैं आपके जवाब को स्वीकार करता और अगर वह इसे उपयोगी मानता, तो भी मेरे लिए (और संभवत: किसी और के लिए) आपका जवाब (जबकि खुद से पूरी तरह सही होते हुए) इस सवाल का जवाब नहीं देता।
एंटनी हैचकिंस

@ फर आप सही कह रहे हैं कि मूल कोड ऐसा दिखता था। लेकिन कम टेम्पलेट तर्क के कारण यह अभी भी काम करता है। मुझे एंटनी हैचकिंस के साथ सहमत होना होगा कि ओपी ने बोली नहीं लगाई, लेकिन त्रुटि से यह पता चलता है कि आपका जवाब अभी भी उन लोगों के लिए उपयोगी है जो स्पष्ट तात्कालिकता के बारे में नहीं जानते थे।
मप्र

खैर, मुझे उदाहरण के लिए ले लो। जब मैंने स्पष्ट तात्कालिकता के बारे में अपनी अच्छी तरह से भूल गए ज्ञान को ताज़ा करना चाहा तो मैंने इस पृष्ठ को गुगला दिया - और इससे मुझे बहुत मदद नहीं मिली। मेरे लिए, सिंटैक्स के बारे में कोई भ्रम नहीं है। स्पष्ट तात्कालिकता के बारे में भ्रम का कारण क्या हो सकता है इसका उपयोग
एंटोनी हैचकिंस

@AntonyHatchkins आह, सच - मैंने मूल प्रश्न के स्रोत को नहीं देखा, बस यह मेरी स्क्रीन पर कैसे दिखाई दिया। मैं इसे +1 करूंगा और मूल प्रश्न के संबंध में भ्रम को नोट करने के लिए अपने मूल उत्तर में संशोधन करूंगा।
hrnt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.