私はC ++ライブラリ(strf)を使用していますが、その中には、次のコードが含まれています。
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) { /* ... */ }
}
今、strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
私のコードで使用したいと思います。しかし、そのようにすると、次のエラーが発生します(CUDA 10.1のNVCCを使用)。
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)
ライブラリのコードは、おそらく使用して例えば(これを避けるために変更することができます。
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)
がRange
ポインタでないことを確認するため); 今は変更できません。代わりに、テンプレート引数を1つだけ指定し、1つは指定せず、もう1つは演繹しないことをコンパイラーに何らかの方法で示す必要があります。
それをしてもいいですか?
C ++ 11とC ++ 14の回答をいただければ幸いです。控除ガイドを含むC ++ 17の回答はそれほど重要ではありませんが、ある場合は投稿してください(将来のNVCCバージョンの場合...)
更新:この状況を回避するためにstrfライブラリ自体が更新されましたが、質問は尋ねられたとおりです。
char*
それは解決策ではありませんか?