ฉันใช้ไลบรารี่ 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)
ในรหัสของฉัน แต่ถ้าฉันทำฉันได้รับข้อผิดพลาดต่อไปนี้ (ด้วย NVCC ของ 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)
ห้องสมุดรหัสอาจจะสามารถเปลี่ยนแปลงได้เพื่อหลีกเลี่ยงปัญหานี้ (เช่นใช้:
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*
แต่ไม่มีใครแก้ปัญหาใช่ไหม