Я использую библиотеку 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*
но не является ли это решением?