Sto usando una libreria C ++ ( strf ) che, da qualche parte al suo interno, ha il seguente codice:
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) { /* ... */ }
}
Ora voglio usare strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
nel mio codice. Ma se lo faccio, ottengo il seguente errore (con NVCC di 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)
Il codice della libreria può probabilmente essere modificato per evitarlo (ad es. 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)
assicurarsi che Range
non sia un puntatore); ma non posso apportare quel cambiamento in questo momento. Invece, voglio in qualche modo indicare al compilatore che intendo davvero avere solo un argomento template, non uno specificato e un altro dedotto.
Posso farlo?
Gradirei le risposte per C ++ 11 e C ++ 14; Le risposte C ++ 17 che coinvolgono le guide alla detrazione sono meno rilevanti, ma se ne hai una, per favore pubblicala (per future versioni NVCC ...)
Aggiornamento: la stessa libreria strf è stata aggiornata per aggirare questa situazione, ma la domanda si pone come posta.
char*
ma non è uno non è una soluzione?