私は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)
_
libraryコードはおそらくこれを回避するために変更できます(たとえば、次のように使用します:
_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バージョンの場合...)
Update:この状況を回避するためにstrfライブラリ自体が更新されましたが、質問は尋ねられたとおりです。
解決策は
1)まず最初に、2番目の引数のタイプを指定する必要があります。 (char *)(some_char_ptr + some_length)
2)両方にconst
を使用しないでください。これは適切に機能します。
strf::range((char *)some_char_ptr, (char *)(some_char_ptr + some_length));
左側の(char *)
を(const char *)
で置き換えることを試みることができますOR右側)、まだ機能します。