Tôi đang sử dụng thư viện C ++ ( strf ), ở đâu đó trong đó, có đoạn mã sau:
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) { /* ... */ }
}
Bây giờ, tôi muốn sử dụng strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
trong mã của tôi. Nhưng nếu tôi làm như vậy, tôi sẽ gặp lỗi sau (với NVCC của 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)
Các thư viện đang có lẽ có thể được thay đổi để tránh điều này (ví dụ sử dụng:
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)
để đảm bảo Range
không phải là một con trỏ); nhưng tôi không thể thay đổi ngay bây giờ. Thay vào đó, tôi muốn bằng cách nào đó chỉ ra cho trình biên dịch rằng tôi thực sự có nghĩa là chỉ có một đối số mẫu, không phải là một đối số được chỉ định và một đối số khác được suy ra.
Tôi có thể làm điều đó?
Sẽ đánh giá cao câu trả lời cho C ++ 11 và C ++ 14; C ++ 17 câu trả lời liên quan đến hướng dẫn khấu trừ ít liên quan hơn nhưng nếu bạn có một câu hỏi, vui lòng đăng nó (cho các phiên bản NVCC trong tương lai ...)
Cập nhật: Bản thân thư viện strf đã được cập nhật để tránh tình trạng này, nhưng câu hỏi vẫn được đặt ra.
char*
nhưng không phải là một giải pháp?