无法转换参数 - 转换失去限定符

时间:2012-03-05 04:32:43

标签: c++ visual-c++

我经常受到const正确性的困扰,这似乎也不例外。请告诉我为什么下面的代码不会编译:

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 个答案:

答案 0 :(得分:5)

当您编写const string_type input_string时,typedef会忽略const。因此,您尝试将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 :(得分:1)

好的,所以根据这个answer,伪代码:

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

因此,const wchar_t*无法转换为const string_type