【问题标题】:cast to string operator overloading in C++在 C++ 中强制转换为字符串运算符重载
【发布时间】:2015-01-28 15:19:00
【问题描述】:

我正在研究一个具有以下签名的方法的类:

operator const std::string & () const

它被记录为“转换为字符串运算符”。 我想知道如何有效地调用它。不幸的是以下表达式:

std::string(foo)

产生这个错误:

some_test.cpp:13:41: error: no matching function for call to'
std::basic_string<char>::basic_string(Foo (&)(std::string))'

考虑到fooFoo 类型,声明和实例化为Foo foo(std::string(filename))

作为 C++ 的初学者,这让我有点困惑。关于这意味着什么的任何提示?

【问题讨论】:

  • 显示foo 的声明,我很确定你与最令人烦恼的 Parse 发生了冲突。
  • 我更新了帖子,声明foo
  • 声明一个函数调用 foo 返回一个 Foo 并且不带任何参数 (())。如果您只想要一个Foo 对象,请将其声明为Foo foo;
  • 抱歉,为简单起见,我省略了构造函数的参数。现在我已经解决了。

标签: c++ c++11 casting operator-overloading overloading


【解决方案1】:

fooFoo 类型,声明和实例化为Foo foo(std::string(filename))

那是一个函数声明,将filename解释为函数参数的名称,相当于

Foo foo(std::string filename);

变量声明如下所示

Foo foo(filename);

或者,如果您需要显式转换(您可能不需要)

Foo foo{std::string(filename)};        // C++11 or later
Foo foo = Foo(std::string(filename));  // historic dialects

【讨论】:

  • 感谢您的回答。实际上,为了简化我实际工作的内容,我省略了实例化参数。我刚刚修好了。
  • @fstab:我已经更新了答案以匹配您的更改。
  • 我不明白你说它是一个函数声明。 filename 是一个const char *,我想做的是将其转换为std::string 类型,然后将其发送到Foo 构造函数(对象实际上将存储在foo 变量中)跨度>
  • @fstab:这是一个函数声明,因为这是你编写函数声明的方式(参数名称周围有或没有())。到string 的转换可以是隐式的,所以Foo foo(filename); 将声明你想要的变量。如果不是,那么您需要在答案末尾使用一种更复杂的形式。
  • 我听从了你的建议并用花括号实例化了foo。现在我得到这个错误:undefined reference to Foo::Foo(std::string const&amp;)',但我可以向你保证,我确实有那个构造函数。
【解决方案2】:

如果你的问题是关于operator const std::string &amp; () const 的用法,那很简单:当你需要转换为std::string 时使用这个操作符。示例:

Foo foo(filename);

std::string s = foo; // uses the declared operator const std::string & () const

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多