下面這段代碼主要用於字符串視圖,其中T={char, const char}
是主要預期的模板實例化目標。自動轉換模板< T>至模板<const T>
cmp函數應該類似於strcmp
比較視圖。 問題是,雖然char*
愉快地轉換爲const char*
我不知道如何得到SVec<char>
轉換爲SVec<const char>
就像愉快。
最後一行(cout<<(cmp(rv, rvc));
)不會編譯。我必須明確地進行轉換(cmp(SVec<const char>(rv), rvc)
)。可以像char*
到const char*
那樣自動運行嗎?
代碼(大大簡化):
template <typename T>
class SVec {
protected:
T* begin_;
size_t size_;
public:
SVec(T* begin, size_t size) : begin_(begin), size_(size) {};
SVec(T* begin, T* end) : begin_(begin), size_(end-begin) {};
SVec(T* begin) : begin_(begin) { while (*(begin++)) {}; size_ = begin - 1 - begin_; }
//^null element indicates the end
///Conversion
operator SVec<const T>() const { return SVec<const T>(begin_, size_); }
};
//General lexicographic compare
template <typename T>
inline int cmp(const SVec<const T>& l, const SVec<const T> & r){
return 1;
}
//Char specialization
template <> inline int cmp<char>(const SVec<const char>& l, const SVec<const char>& r){
return 1;
}
//Explicit instantiation
template int cmp<char>(const SVec<const char>& l, const SVec<const char>& r);
#include <iostream>
int main(){
using namespace std;
char ar[] = "st";
SVec<char> sv = ar;
SVec<const char> svc = "str";
cout<<(cmp(SVec<const char>(sv), svc));
cout<<(cmp(sv, svc));
}
您的問題不是轉換,而是扣除。用戶定義的轉換不考慮類型演繹,因此'cmp(const SVec&'無法在'cmp(sv,svc)'行中將'const T'與'char'進行匹配(不存在'T'這樣的'const T'等於'char') –
dyp
@dyp謝謝。'cmp(...)'修復了它。 –
PSkocik
@dyp你可以做出答案嗎? –