2012-03-05 2 views
3

Меня часто беспокоит постоянная корректность, и это, похоже, не является исключением. Пожалуйста, сообщите мне, почему следующий код обыкновение компиляции:Невозможно преобразовать параметр - Отклонение от конверсии теряет квалификаторы

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. Дополнительные параметры компиляции/компоновщика доступны по запросу.

ответ

5

Когда вы пишете 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, и он также будет работать.

+0

«... const игнорируется ...». Не могли бы вы уточнить, почему этот const игнорируется (или не учитывается при преобразовании)? –

+1

@ J.N .: это 'const' в' string_token_stream (const string_type input_string) 'делает' input_string' const, а не то, на что указывает. Если вы попытаетесь присвоить 'input_string' что-нибудь внутри функции, компилятор даст вам ошибку, например,' назначение параметра только для чтения 'input_string''. Я думаю, что это происходит из-за того, что 'const/volatile type' и' type const/volatile' эквивалентны, порядок не имеет значения. –

+0

@ Alex: да, спасибо, я понял это сам, был вопрос, связанный с SO. –

1

ОК, так что в соответствии с этим answer, в псевдокоде:

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

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

Смежные вопросы