Невозможно преобразовать параметр - преобразование теряет квалификаторы - PullRequest
3 голосов
/ 05 марта 2012

Меня часто беспокоит правильность, и это, кажется, не исключение.Пожалуйста, сообщите мне, почему следующий код не компилируется:

class string_token_stream
{
    public:

    typedef wchar_t* string_type;

    string_token_stream(const string_type input_string)
        : _input_string(input_string)
    {
    }

    private:

    const string_type _input_string;
};

int main(int argc, char **argv)
{
    const wchar_t *str = get_a_string_somewhere();
    string_token_stream sts(str);
    //                      ^------ Compile-time error C2664.
    return 0;
}

Приведена ошибка:

error C2664: 'string_token_stream::string_token_stream(const string_token_stream::string_type)' : cannot convert parameter 1 from 'const wchar_t *' to 'const string_token_stream::string_type'
1>          Conversion loses qualifiers

Я компилирую в Visual C ++ 2010 Express.Дополнительные параметры компиляции / компоновщика доступны по запросу.

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

Когда вы пишете const string_type input_string, const игнорируется для typedef.Итак, вы пытаетесь конвертировать const wchar_t* в wchar_t*.Если вы измените typedef wchar_t* string_type; на typedef const wchar_t* string_type;, он должен скомпилироваться.

const string_type input_string будет выглядеть как wchar_t *const input_string, тогда как вы ожидаете const wchar_t*.Вы можете увидеть это, изменив const wchar_t *str на wchar_t *const str, и это также будет работать.

1 голос
/ 05 марта 2012

ОК, поэтому согласно этому ответу в псевдокоде:

"const string_type" <=> "const (char *)" <=> char const *      and not "(const char) *".

Итак, const wchar_t* не может быть преобразовано в const string_type.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...