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

时间:2018-10-26 22:10:57

标签: c++

我正在尝试将类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;
}

我要解决的是s = A();的部分。它在编译期间失败,并且编译器告诉我没有将A分配给字符串的'='分配运算符。

有趣的是:

  • 如果调用了它的副本构造函数(使用std::string s = A();),“转换运算符”将启动并起作用(但我希望s = A()也起作用)。
  • 如果我删除模板方法,s = A();也可以使用。

有人可以解释是什么引发了不同的行为吗?

1 个答案:

答案 0 :(得分:4)

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

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

现在的优势是,所有四种可能性都起作用:

  std::string s;
  s = A();

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