Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配给转换运算符失败-C++;_C++ - Fatal编程技术网

C++ 分配给转换运算符失败-C++;

C++ 分配给转换运算符失败-C++;,c++,C++,我试图将classA转换为字符串,如下所示: #include <iostream> #include <string> class A { public: std::string data_ = "hello world"; A() {} operator std::string() const { return data_; } template <typename T> operator T() const {

我试图将class
A
转换为字符串,如下所示:

#include <iostream>
#include <string>

class A {
public:
  std::string data_ = "hello world";

  A() {}

  operator std::string() const {
    return data_;
  }

  template <typename T>
  operator T() const {
    return data_;
  }
};

int main() {
  A();

  // This fails
  // std::string s;
  // s = A();

  std::string s = A(); // This works
  return 0;
}
#包括
#包括
甲级{
公众:
std::string data=“hello world”;
A(){}
运算符std::string()常量{
返回数据;
}
模板
运算符T()常量{
返回数据;
}
};
int main(){
A();
//这失败了
//std::字符串s;
//s=A();
std::string s=A();//这很有效
返回0;
}
我试图解决的是
s=A()。它在编译过程中失败,编译器告诉我没有“=”assignment操作符将
赋值到字符串中

有趣的是:

  • 如果调用了一个复制构造函数(使用
    std::string s=a();
    ),则“转换运算符”将开始工作(但我希望
    s=a()
    也能工作)
  • 如果我删除模板方法,
    s=A()工作

有人能解释一下触发不同行为的原因吗?

解决方案很简单。使其显式而非隐式转换:

  template <typename T>
  explicit operator T() const {
    return data_;
  }

你在用什么编译器?gcc和clang解释了当我删除模板时发生的事情(模棱两可的重载)。M.M是对的,您的程序是不明确的。@M.M在clang和gcc上试过。是的,我知道它是不明确的,但我真的不知道转换运算符何时优先于赋值运算符。@smac89我在第二个要点中已经提到,如果删除模板方法,它会起作用。奇怪的是,为什么引入时行为不同。@chutsu问题是
std::string::operator=
有许多重载,并且有多个可能的用户定义的转换序列
string::operator=(string)
您能解释一下为什么显式设置运算符可以解决这个问题吗?此新运算符是否优先于现有的非模板版本?此结果相当于完全删除
运算符T()
,因为示例中已经存在
运算符std::string
。询问者已经注意到,“如果我删除模板方法,s=A();会起作用。”大概询问者想要一个转换为类型而不是
std::string()
?@的解决方案,但这并不等同于完全删除
操作符T()
。如果有一个
T
可以从
字符串构建,它仍然可以显式地called@user463035818在本例中,结果是等效的。您显示的所有“四种可能性”呼叫
操作员std::string
;无调用显式运算符T
。如果您有一个例子,其中
explicit
操作符做了一些有用的事情,那么您的答案将通过显示它而得到改进。@缺少它不是我的答案;)。无论如何,正如我所理解的OP,他们确实希望调用
操作符std::string
,它不起作用的原因是
操作符T
的存在,使
操作符T
显式允许您调用
操作符string
隐式,而不会产生歧义
  std::string s;
  s = A();

  std::string s2 = A(); // This works
  std::string s3 = std::string(A());
  std::string s4;
  s4 = std::string(A());