Я використовую бібліотеку 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)
в своєму коді. Але якщо я це роблю, я отримую таку помилку (з NVCC CUDA 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
це не покажчик); але я не можу зараз змінити це. Натомість я хочу якось вказати компілятору, що я дійсно маю на увазі мати лише один аргумент шаблону, а не один вказаний та інший виведений.
Чи можу я це зробити?
Будемо вдячні за відповіді на C ++ 11 та C ++ 14; C ++ 17 відповідей, що містять посібники щодо вирахування, є менш актуальними, але якщо у вас є, будь ласка, опублікуйте його (для майбутніх версій NVCC ...)
Оновлення: сама бібліотека strf була оновлена, щоб обійти цю ситуацію, але питання стоїть як задане.
char*
але хіба це не є рішенням?