Korzystam z biblioteki C ++ ( strf ), która gdzieś w niej zawiera następujący kod:
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) { /* ... */ }
}
Teraz chcę użyć strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
w moim kodzie. Ale jeśli to zrobię, pojawia się następujący błąd (z 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)
Biblioteka kod może być prawdopodobnie zmieniła tego uniknąć (np za pomocą:
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)
upewnić Range
się, że nie jest wskaźnikiem); ale nie mogę teraz wprowadzić tej zmiany. Zamiast tego chcę w jakiś sposób wskazać kompilatorowi, że naprawdę mam na myśli tylko jeden argument szablonu, nie jeden określony, a drugi wywnioskowany.
Czy mogę to zrobić?
Byłbym wdzięczny za odpowiedzi dla C ++ 11 i C ++ 14; Odpowiedzi w C ++ 17 dotyczące przewodników po dedukcji są mniej przydatne, ale jeśli masz, opublikuj je (dla przyszłych wersji NVCC ...)
Aktualizacja: sama biblioteka strf została zaktualizowana w celu obejścia tej sytuacji, ale pytanie jest zadane.
char*
ale czy to nie jest rozwiązanie?