【问题标题】:Errors C2664 and E0167, stumped错误 C2664 和 E0167,难倒
【发布时间】:2018-02-26 11:56:47
【问题描述】:

我正在学习 C++ 初学者的距离课程,但无法解决此编译错误。它的编写与示例书中的完全相同,当我的兄弟将其剪切并粘贴到他的 VS2015 中时,它可以正常工作,但在我的 VS2017 中却不行。 我已经卸载并重新安装了 VS2017 社区,但无济于事。

我只编码了 2 周,所以我对此非常非常陌生。

我得到的错误代码是:

错误 E0167 “const char”类型的参数与“char”类型的参数不兼容
错误 C2664 'void Hello(char )': 无法将参数 1 从 'const char [8]' 转换为 'char'

代码:

// FUNCTION: Hello, prints out a welcome message on the screen.
void Hello(char* name)
{
 cout << "Hello " << name << "!";
}

// FUNCTION: Main, program start.
int main()
{
 Hello("Krister");
 cin.get();
 return 0;
}

我真的希望有人可以帮助我。

一切顺利, 杰普

【问题讨论】:

  • 究竟有什么不清楚的地方?您将const char* 传递给接受char* 的函数。这些类型不兼容。
  • 将方法签名更改为void Hello(const char* name),它应该可以正常工作。 VS2017 默认对 const 的正确性更加严格。
  • 所有文字字符串都是常量文字字符串。它们实际上是常量字符数组,指向它们的指针必须是指向const字符的指针。
  • 你们为什么要在 cmets 部分回答?
  • 非常感谢你们的帮助,我真的很感激。看来我的课本有一些大问题。

标签: c++ c2664


【解决方案1】:

const char* 可以引用字符串文字。

它可能不会被char* 引用;这在旧版本的 C 中是可能的,并且一些旧的 C++ 编译器允许它并发出警告。在现代是完全禁止的。

通过将"Krister" 传递给采用char* 的函数,您要求编译器尝试将一个转换为另一个;由于上述规则,它失败了,正如错误消息所证明的那样。

在其中加入 const 以获得巨大成功。

如果该代码来自教科书,丢掉它。 Here is a list of good C++ books.

【讨论】:

  • 这本书的质量差,我完全被震撼了,有很多错误,但这确实是这样。非常感谢您的解释!
  • @Jeppen:没问题。不幸的是,那里不乏糟糕的教材(其中大约 50% 在 YouTube 上)
【解决方案2】:

只是为了补充Lightness Races in Orbit 的答案,它描述了您绝对应该做什么。 VS2015和VS2017区别的原因在于后者设置了/permissive标志off by default,不像前者。

这意味着 VS2017 很可能会拒绝“你兄弟的”VS2015 接受的代码,除非对项目选项进行了修补。

我建议您将标志保持在关闭状态。严格的一致性很好,它会让你养成更好的习惯,写出更便携的 C++。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-12-22
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多