Estou usando uma biblioteca C ++ ( strf ) que, em algum lugar dentro dela, tem o seguinte código:
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) { /* ... */ }
}
Agora, quero usar strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
no meu código. Mas, se o fizer, obtenho o seguinte erro (com o NVCC da 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)
O código da biblioteca provavelmente pode ser alterado para evitar isso (por exemplo, usando:
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)
garantir que Range
não seja um ponteiro); mas não posso fazer essa alteração agora. Em vez disso, quero de alguma forma indicar ao compilador que realmente pretendo ter apenas um argumento de modelo, não um especificado e outro deduzido.
Posso fazer isso?
Gostaria de receber respostas para C ++ 11 e C ++ 14; As respostas C ++ 17 que envolvem guias de dedução são menos relevantes, mas se você tiver uma, publique-a (para versões futuras do NVCC ...)
Atualização: A própria biblioteca strf foi atualizada para contornar essa situação, mas a pergunta permanece conforme a pergunta.
char*
mas não seja, não é uma solução?