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

Cannot convert parameter - Conversion loses qualifiers

本文关键字:转换 参数      更新时间:2023-10-16

我经常被常量正确性所困扰,这似乎也不例外。请告诉我为什么以下代码无法编译:

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学习版上进行编译。可根据要求提供其他编译/链接器选项。

在编写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来看到这一点,它也会起作用。

好的,所以根据这个答案,在伪代码中:

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

因此,const wchar_t*不能转换为const string_type