আমি একটি সি ++ গ্রন্থাগার ( স্ট্র্যাফ ) ব্যবহার করছি যা এর মধ্যে কোথাও নীচের কোড রয়েছে:
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)
আমার কোড ব্যবহার করতে চাই তবে আমি যদি এটি করি তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি (সিইউডিএ 10.1 এর এনভিসিসি সহ):
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
করা কোনও পয়েন্টার নয়); তবে আমি এখনই এই পরিবর্তন করতে পারি না। পরিবর্তে, আমি কোনওভাবে সংকলককে ইঙ্গিত করতে চাই যে আমি সত্যই বলতে চাইছি কেবলমাত্র একটি নির্দিষ্ট টেমপ্লেট যুক্তি রয়েছে, একটি নির্দিষ্ট নয় এবং অন্যটিকে ছাড় দেওয়া হয়েছে।
আমি কি এটা করতে পারি?
সি ++ 11 এবং সি ++ 14 এর জন্য উত্তরগুলি প্রশংসা করবে; C ++ 17 টি উত্তর কাটা গাইডের সাথে জড়িত কম প্রাসঙ্গিক তবে আপনার যদি একটি থাকে তবে দয়া করে এটি পোস্ট করুন (ভবিষ্যতের এনভিসিসি সংস্করণের জন্য ...)
আপডেট: স্ট্র্যাফ লাইব্রেরি নিজেই এই পরিস্থিতি থেকে বাঁচানোর জন্য আপডেট করা হয়েছে, তবে প্রশ্ন যেমন রয়েছে তেমন দাঁড়িয়েছে।
char*
তবে একটি সমাধান নয়?