如果我尝试使用iOS4 sdk版本的gcc编译以下内容 它给了我错误:
从'const char [4]'转换为非标量类型'UsesStr'请求
class strptr {
public:
strptr(const char * s) : s_(s) {}
const char *c_str() const { return(s_); }
protected:
const char *s_;
};
class UsesStr {
public:
UsesStr(const strptr &sp)
: p_(sp.c_str())
{
}
const char *p_;
};
static UsesStr ustr = "xxx";
这是一个简单的例子,当strptr是一个字符串类而不是错误是相同时,这是一个问题。
根据下面的答案我尝试了这似乎确实有效。 希望有一个“通用”字符串arg,它将接受许多类型的字符串,因为它将转换放在构造函数中以分解所有转换,而不需要在仅使用一种类型的事物中完全声明所有可能的字符串类型。 / p>
class UsesStr;
class strptr {
public:
strptr(const char * s) : s_(s) {}
strptr(UsesStr &s);
const char *c_str() const { return(s_); }
operator const char *() const { return(s_); }
private:
const char *s_;
};
class UsesStr {
public:
template<typename arg>
UsesStr(const arg &sp)
: p_(strptr(sp).c_str())
{}
UsesStr(const strptr &sp) : p_(sp.c_str())
{}
const char *p_;
operator const strptr() const { return(strptr(p_)); }
};
strptr::strptr(UsesStr &s)
: s_(s.p_) {}
static UsesStr ustr = "xxx";
static UsesStr ustr2 = ustr;
static strptr sp = ustr2;
static UsesStr ustr3 = sp;
答案 0 :(得分:7)
static UsesStr ustr = "xxx";
需要两次隐式转换,第一次从const char[4]
到strptr
,第二次从strptr
到UsesStr
。您不能连续两次隐式用户转换。这些可行:
static UsesStr ustr = strptr( "xxx" );
static UsesStr ustr = UsesStr( "xxx" );
static UsesStr ustr( "xxx" );
如果您确实需要编写代码,那么您需要在UsesStr
中添加strptr
构造函数。
答案 1 :(得分:0)
使用此:
static strptr sptr = "xxx";
static UsesStr ustr = sptr ;
我不认为编译器可以处理一系列隐式转换:在你的情况下从const char *到strptr到UsesStr。