Если я попытаюсь скомпилировать приведенную ниже версию SDK для iOS4 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 - это строковый класс, который используется вместо этого, но ошибка та же.
основываясь на ответе ниже, я попробовал это, которое, кажется, работает.
Желание иметь "универсальный" строковый аргумент, который будет принимать много типов строк, поскольку он помещает преобразование в конструктор, чтобы исключить все преобразования и не требовать полного объявления всех возможных типов строк в вещах, которые используют только один тип.
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;