我正在使用一个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
不是一个指针,但目前不能修改它。相反,我想以某种方式表明给编译器看我只想只有一个模板参数,而不是一个已经指定和另一个被推断的。
我可以这样做吗?
希望提供C++11和C++14的答案;对于涉及推导指南的C++17答案可能不太相关,但如果您有,请发布它(为将来的NVCC版本...)
更新: strf库本身已进行了更新,以规避此情况,但问题仍然存在。
char*
但实际上并不是char*
的解决方案不可行? - Konrad Rudolph