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

#include <string>

using std::string;

// In real life, fetch the stringified object.
template<>
string foo(int x);

// In real life, fetch an object and deserialize it.
template <typename T>
T foo(int x) {
    string s = foo<string>(x);
    T t;
    // Do something with s.
    return t;
}

template<>
string foo(int x) { return std::to_string(x); }

के साथ संकलन

clang -Wall -Wextra -std=c++14 foo.cc -o foo

कहते हैं

foo.cc:6:8: error: no function template matches function template specialization 'foo'
string foo(int x);

तो स्पष्ट समाधान सिर्फ पहला फ़ंक्शन को string make_foo(int x) में बदलना है और इसके साथ किया जाना है।

मुझे सीखने में मदद करने के लिए, मैं यह समझने की कोशिश कर रहा हूं कि मैंने ऊपर जो लिखा है वह विफल क्यों है। ध्यान दें कि मैंने template <> string foo<string>(int x) भी कोशिश की, हालांकि मुझे लगता है कि विशेषज्ञता का अनुमान लगाया जा सकता है।

0
jma 23 नवम्बर 2015, 13:51

2 जवाब

सबसे बढ़िया उत्तर

कंपाइलर को जेनेरिक डिक्लेरेशन देखने की ज़रूरत होती है, इससे पहले कि आप स्पेशलाइज़ेशन की घोषणा कर सकें, इसलिए सिर्फ़ डिक्लेरेशन का क्रम बदल दें।

2
Some programmer dude 23 नवम्बर 2015, 11:28

यहां विशेषज्ञता का अनुमान नहीं लगाया जा सकता है क्योंकि फ़ंक्शन का वापसी प्रकार फ़ंक्शन घोषणा का हिस्सा नहीं है। इस प्रकार, यदि कोई कार्य पैरामीटर प्रकार टेम्पलेट पैरामीटर पर निर्भर नहीं करता है, तो आपको पूर्ण विशेषज्ञता लिखनी होगी:

template<>
std::string foo<std::string>(int x)
{
   /* ... */
}

उदाहरण के लिए, निम्नलिखित मामले में, आप संकलक को विशेषज्ञता का अनुमान दे सकते हैं:

template<class T>
void f(T arg)
{
    // generic case
    /* ... */
}

template<>
void f(bool arg)
{
    // bool case
    /* ... */
}
1
YSC 23 नवम्बर 2015, 10:56