J'utilise une bibliothèque C ++ ( strf ) qui, quelque part en elle, a le code suivant:
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) { /* ... */ }
}
Maintenant, je veux utiliser strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
dans mon code. Mais si je le fais, j'obtiens l'erreur suivante (avec le NVCC de 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)
Le code de la bibliothèque peut probablement être modifié pour éviter cela (par exemple en utilisant:
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)
s'assurer Range
n'est pas un pointeur); mais je ne peux pas faire ce changement pour le moment. Au lieu de cela, je veux en quelque sorte indiquer au compilateur que je veux vraiment vraiment n'avoir qu'un seul argument de modèle, pas un spécifié et un autre déduit.
Puis-je faire cela?
Souhaiterait des réponses pour C ++ 11 et C ++ 14; Les réponses C ++ 17 impliquant des guides de déduction sont moins pertinentes mais si vous en avez un, veuillez le poster (pour les futures versions de NVCC ...)
Mise à jour: la bibliothèque strf elle-même a été mise à jour pour contourner cette situation, mais la question demeure telle qu'elle a été posée.
char*
mais n'en est-il pas un n'est pas une solution?