Ich verwende eine C ++ - Bibliothek ( strf ), die irgendwo darin den folgenden Code enthält:
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) { /* ... */ }
}
Jetzt möchte ich strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
in meinem Code verwenden. In diesem Fall wird jedoch der folgende Fehler angezeigt (mit dem NVCC von 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)
Der Bibliothekscode kann wahrscheinlich geändert werden, um dies zu vermeiden (z. B. mit:
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)
zu gewährleisten Range
ist kein Zeiger); Aber ich kann das jetzt nicht ändern. Stattdessen möchte ich dem Compiler irgendwie anzeigen, dass ich wirklich nur ein Vorlagenargument haben möchte, nicht eines angegeben und ein anderes abgeleitet.
Kann ich das machen?
Würde mich über Antworten für C ++ 11 und C ++ 14 freuen; C ++ 17-Antworten mit Abzugsleitfäden sind weniger relevant. Wenn Sie jedoch eine haben, veröffentlichen Sie diese bitte (für zukünftige NVCC-Versionen ...).
Update: Die strf-Bibliothek selbst wurde aktualisiert, um diese Situation zu umgehen, aber die Frage bleibt wie gestellt.
char*
aber ist einer keine Lösung?