【问题标题】:Constructing a custom string class in c++ from string literals从字符串文字在 C++ 中构造自定义字符串类
【发布时间】:2015-11-16 13:01:36
【问题描述】:

我最近在使用 C++03 时遇到了一个非常讨厌的问题。 我需要创建一个新的字符串类来扩展std::string 的功能,提供额外的方法和更方便的处理。 一切进展顺利,除了一个问题:如果某个函数需要一个 MyString 参数并被赋予一个字符串文字(即 "Hello"),它无法将 const char[6] 转换为 MyString,尽管事实上MyString 有一个接受 std::string 的 c'tor。 例如,这些行将起作用:

MyString mStr("Hello");
MyString mStr = "Hello";

但是这段代码不起作用:

void myFunc(const MyString& mStr);
myFunc("Hello");

因为"no constructor exists that can perform the conversion from const char[6] into MyString"

添加一个接受 const char * 的 c'tor 无助于解决问题,甚至尝试用不同组合的 explicit 标记它们也无济于事。

在这个错误上花费了几个小时之后,我得出的结论是,它可能无法做这样的事情,因为它可能需要编译器不会执行的两个隐式转换,但是正如我所说,添加一个来自const char * 的 c'tor 在 1 步中启用转换并没有改变任何东西。所以在我放弃之前,你们有没有什么想法可以解决这个问题?

【问题讨论】:

  • 添加构造函数MyString(const char *) 绝对可以。在这种情况下,您遇到了什么错误?
  • 你能展示一下类和所有的构造函数吗?
  • @rodrigo,目前的 c'tors 是:MyString(); MyString(const char* str); MyString(const std::string& str);我得到的错误是:“错误 C2664:无法将参数 1 从 'const char *' 转换为 MyString'”
  • @OmriP:我刚刚尝试了一个带有这两个构造函数的类,myFunc("hello") 编译得很好。你真的应该向我们展示你的代码。
  • 请创建一个Minimal, Complete, and Verifiable Example 并告诉我们。同时向我们展示exactcompleteunedited构建日志。

标签: c++ string visual-c++ constructor c++03


【解决方案1】:

至于MyString的构造函数采用std::string const&,编译器无法从const char*std::string转换为MyString,以便调用myFunc,因为这是两个隐式转换,而它只能做一个。见this post

如果const char* 是参数,I could not reproduce your erorrs。此外,在此处创建构造函数explicit 不会有任何好处,它甚至会禁止允许的隐式转换。 See it here.

【讨论】:

  • 我了解,但是 const char * 和 std::string 有 2 个不同的 c'tors 会使编译器抱怨“模棱两可”,而添加“显式”是我尝试解决此问题的方法.
  • 再次,not reproduced。等等,没有测试两个初始化。还有,I just did.
  • @OmriP:如果您添加explicit,那么您的构造函数将不会被隐式找到。如果因为可以进行两次转换而产生歧义,那么解决它的正确方法是添加另一个不需要转换的重载。
  • @LogicStuff 感谢您的编辑。您可能会说,我是 SO 新手,所以我仍然不知道如何正确格式化我的文本。我不得不问,为什么我的问题被否决了?这对我来说仍然是一个非常现实的问题......
  • 你的问题很好,格式没问题。我进行了编辑,所以我得到了一个徽章:) 我不知道谁投了反对票,但可能是因为您的问题无法重现(而且您从一开始就没有提供 MCVE)。非常感谢 MCVE,如果您没有它,如您所见,您将无法获得适合您的答案。
【解决方案2】:

使用参数“const char *”(MyString(const char *)) 定义构造函数应该可以解决此问题。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多