64,636
社区成员
发帖
与我相关
我的任务
分享
// 先包含头文件
#include <string>
using namespace std;
class CCrossString : public string
{
public:
CCrossString(const char* lpsz) : string(lpsz) {};
char operator []( size_t nIndex ) const
{
return __super::operator[](nIndex);
}
operator const char*() const // 实现自动类型转换
{
return (const char*)__super::data();
}
};
//开始使用
CCrossString str("abc");
const char* lpsz = (const char*)str;// lpsz 的内容现在就是 "abc"
char c = str[1];//如果把此句注释掉就没有问题
template <typename T>
char operator []( T nIndex ) const
这不是编译器 bug,原来的写法 str[1] 会导致二义性,因为 [] 和 const char* 都适用,而且都存在隐式类型转换,无法决议。explicit operator const char*() const // 必须显示调用
{
return (const char*)__super::data();
}
也可以在调用时显示调用:char c = str.operator[](1);