निम्नलिखित कोड अस्पष्टता समस्या को हल कर सकते हैं:
#include <iostream>
#include <string>
// Helper class providing a function call
template <typename T>
class PrintHelper
{
protected:
void print_impl(const T& t) { std::cout << t << std::endl; }
};
// Provides a print method for each type listed
template <typename... Ts>
class Printer : public PrintHelper<Ts>...
{
public:
template <typename U>
void print(const U& u) {
PrintHelper<U>::print_impl(u);
};
};
int main()
{
Printer<int, std::string> p;
p.print(std::string("Hello World")); // Ambiguous Call
}
कौन सा बहुत अच्छा नहीं है की वजह से आवश्यकता यू कि प्रकार (कॉल पर कटौती) वें वें में से एक है विविध प्रकार की सूची में ई प्रकार। आप उस मुद्दे को हल करने के लिए चीजों को थोड़ा सा कल्पना करने में सक्षम हो सकते हैं। टेम्पलेट जादू और Sfinae के साथ, आप शायद यह काफी आसानी से हल कर सकते हैं (लेकिन यह निश्चित रूप से साफ और साफ नहीं है)।
अस्पष्टता समस्या टेम्पलेट या वैरिएडिक टेम्पलेट्स के उपयोग से संबंधित नहीं है, बेशक, यह सदस्य लुकअप नियमों (मानक के अनुभाग 10.2/2) का एक सीधा-आगे आवेदन है, यानी, अक्सर तथाकथित "सदस्य छिपाने के नियम"। आप इस सरल गैर टेम्पलेट संस्करण ले, तो आप एक ही अस्पष्टता समस्या मिल जाएगा, लेकिन यह करने के लिए एक बहुत ही सरल समाधान के साथ:
struct IntPrinter {
void print(const int& i) { std::cout << i << std::endl; };
};
struct StringPrinter {
void print(const std::string& s) { std::cout << s << std::endl; };
};
struct IntStringPrinter : IntPrinter, StringPrinter {
using IntPrinter::print; // These using-statements will solve the problem
using StringPrinter::print; // by importing all 'print' functions to the same
// overload resolution level.
};
तो, समस्या यहाँ वास्तव में है कि अस्पष्टता उठता संकलक से पहले भी कोशिश करता है सामान्य अधिभार-रिज़ॉल्यूशन नियमों को लागू करने के लिए, क्योंकि यह पहले यह पता लगाने की कोशिश करता है कि सदस्य कार्य (ओं) को खोजने के लिए विरासत की कौन सी शाखा का पालन करना है, और फिर, यह केवल एक विरासत स्तर पर अधिभार को हल करेगा। और भिन्नता टेम्पलेट्स का उपयोग करते समय समस्या यह है कि समानता स्तर तक सभी प्रिंट फ़ंक्शंस आयात करने के लिए "उपयोग" कथन के सेट को अनपैक करने का कोई तरीका नहीं प्रतीत होता है। अगर कोई इस तरह के उपयोग-बयान को अनपैक करने के तरीके के बारे में जानता है, तो मैं सभी कान हूं। आपको प्री-वैरैडिक-टेम्पलेट समाधान (10 तर्कों के साथ एक सामान्य टेम्पलेट की तरह, और सभी दस संस्करणों के लिए विशेषज्ञ) पर वापस आना पड़ सकता है।
स्रोत
2012-12-13 17:47:23
जीसीसी 4.7.2 ([liveworkspace] पर (http://liveworkspace.org/code/1a4YN8$0) के साथ एक ही समस्या। कॉपी/पेस्टेबल उदाहरण बीटीडब्ल्यू के लिए धन्यवाद। –
क्लैंग 3.2 ट्रंक 165721 कहता है: 'त्रुटि: सदस्य' प्रिंट 'विभिन्न प्रकार के कई आधार वर्गों में पाया गया है – user786653
यह भी देखें [यह प्रश्न] (http://stackoverflow.com/questions/5368862/why-do-multiple-herherited -functions-साथ-ही-नाम बल्कि अलग-हस्ताक्षर-नहीं)। यह संक्षेप में छुपा नियमों के संयोजन की समस्या और अनपॅकिंग वैरिएड टेम्पलेट तर्कों की बहुत सीमित क्षमताओं में है। –