我经常受到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。可根据要求提供其他编译/链接器选项。
答案 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
。