Как исправить ошибку цепочки преобразования const char * constructor в компиляции GCC - PullRequest
0 голосов
/ 12 октября 2011

Если я попытаюсь скомпилировать приведенную ниже версию 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;

Ответы [ 2 ]

7 голосов
/ 12 октября 2011
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.

0 голосов
/ 12 октября 2011

Используйте это:

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

Я не думаю, что компилятор может обрабатывать цепочку неявных преобразований: в вашем случае от const char * до strptr до UsesStr.

...