2011-10-12 77 views
0

如果我尝试使用gcc的iOS4 sdk版本编译下面的代码。
它给我的错误:从“为const char [4]”如何修复GCC编译中的const char *构造函数转换链错误

转换到非标量类型“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,它将接受许多类型的字符串,因为它将转换放入构造函数中以将所有转换分解出来,而不需要对仅使用一种类型的东西的所有可能字符串类型进行完整声明。

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; 

回答

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"); 

如果你真的需要有代码,你写的,那么你就需要从strptrUsesStr添加一个构造函数。

+0

上面的代码没有strptr的构造函数吗?或者你的意思是不是一个const&strptr?谢谢。 – peterk

0

使用此:

static strptr sptr = "xxx"; 
static UsesStr ustr = sptr ; 

我不认为编译器可以处理隐式转换链:在你的情况下,从为const char *到strptr到UsesStr。

+0

唉 - MSC做到了,新的GCC没有。所以不能对方法或构造函数做出“变体”参数,并使其适用于两者。 – peterk

+0

顺便说一句MSC可以设置完成所有这些,因为它的超负荷分辨率优先顺序不同于GCC,它的优先顺序是来自源代码的跳数,GCC - 我最近似乎忽略了“显式”,如果有的话是另一个隐含的链,它会导致显式构造函数的值和其他一些事情 - 结果是手动控制构造函数过载优先级是非常困难的。 – peterk