그 안에 어딘가에 다음 코드가 있는 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*
같지만 해결책은 아닙니다.