मैं एक C ++ लाइब्रेरी ( strf ) का उपयोग कर रहा हूं , जो कहीं न कहीं, इसके भीतर निम्नलिखित कोड है:
namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }
template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
अब, मैं strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
अपने कोड में उपयोग करना चाहता हूं। लेकिन अगर मैं ऐसा करता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है (CUDA 10.1 के NVCC के साथ):
error: more than one instance of overloaded function "strf::range" matches the argument list:
function template "auto strf::range(ForwardIt, ForwardIt)"
function template "auto strf::range(const Range &, const CharT *)"
argument types are: (util::constexpr_string::const_iterator, util::constexpr_string::const_iterator)
इससे बचने के लिए लाइब्रेरी कोड को संभवतः बदला जा सकता है (उदाहरण के लिए:
inline auto range(const typename std::enable_if<not std::is_pointer<typename std::remove_cv<Range>::type>::value, Range &>::type range, const CharT* sep)
सुनिश्चित करने के लिए Range
एक सूचक नहीं है); लेकिन मैं अभी उस बदलाव को नहीं कर सकता। इसके बजाय, मैं किसी भी तरह संकलक को इंगित करना चाहता हूं कि मैं वास्तव में केवल एक टेम्पलेट तर्क का मतलब रखता हूं, एक निर्दिष्ट नहीं और दूसरा एक घटाया हुआ।
क्या मै वह कर सकता हूं?
C ++ 11 और C ++ 14 के उत्तर की सराहना करेंगे; कटौती गाइड से जुड़े सी ++ 17 जवाब कम प्रासंगिक हैं लेकिन अगर आपके पास एक है, तो कृपया इसे पोस्ट करें (भविष्य के एनवीसीसी संस्करणों के लिए ...)
अद्यतन: इस स्थिति को दरकिनार करने के लिए strf लाइब्रेरी को ही अपडेट किया गया है, लेकिन सवाल जैसा पूछा गया है।
char*
लेकिन क्या कोई एक समाधान नहीं है?