我常常被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。 可根据要求提供其他编译/链接器选项。
I'm frequently troubled by const correctness, and this seems to be no exception. Please advise me why the following code wont compile:
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; }The error given is:
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 qualifiersI'm compiling on Visual C++ 2010 Express. Additional compile/linker options available upon request.
最满意答案
当您编写const string_type input_string ,将忽略typedef的const 。 所以你试图将const wchar_t*转换为wchar_t* 。 如果你改变typedef wchar_t* string_type; to 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来看到这一点,它也可以工作。
When you write const string_type input_string the const is ignored for typedef. So you are trying to convert const wchar_t* to a wchar_t*. If you changetypedef wchar_t* string_type; to typedef const wchar_t* string_type; it should compile.
const string_type input_string would look like wchar_t *const input_string whereas you expected const wchar_t*. You can see this by changing const wchar_t *str to wchar_t *const str and it will also work.
更多推荐
发布评论