Saya menggunakan pustaka C ++ ( strf ) yang, di suatu tempat di dalamnya, memiliki kode berikut:
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) { /* ... */ }
}
Sekarang, saya ingin menggunakan strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)
kode saya. Tetapi jika saya melakukannya, saya mendapatkan kesalahan berikut (dengan 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)
The perpustakaan kode mungkin dapat diubah untuk menghindari ini (misalnya menggunakan:
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)
untuk memastikan Range
bukan pointer); tapi saya tidak bisa melakukan perubahan itu sekarang. Sebagai gantinya, saya ingin menunjukkan ke kompiler bahwa saya benar-benar bermaksud hanya memiliki satu argumen templat, bukan satu yang ditentukan dan satu lagi dideduksi.
Bisakah saya melakukan itu?
Akan menghargai jawaban untuk C ++ 11 dan C ++ 14; C ++ 17 jawaban yang melibatkan panduan deduksi kurang relevan tetapi jika Anda punya, silakan posting (untuk versi NVCC mendatang ...)
Pembaruan: Perpustakaan strf itu sendiri telah diperbarui untuk menghindari situasi ini, tetapi pertanyaannya tetap seperti yang ditanyakan.
char*
tetapi bukankah itu bukan solusi?