【问题标题】:Error when using operator << with implicitly converted non-fundamental data types [duplicate]将运算符 << 与隐式转换的非基本数据类型一起使用时出错 [重复]
【发布时间】:2018-06-14 17:49:35
【问题描述】:

我有一个结构,它可以作为其他类型的包装器,如下所示:

template<typename T>
struct A {
  A& operator=(const T& value){
    m_value = value;
    return *this;
  }

  operator T() const {
    return m_value;
  }

private:
  T m_value;
};

我是这样使用的:

int main() {
  A<int> a;
  a = 5;                  // Copy assignment constructor
  std::cout << a << "\n"; // Implicit conversion to int
}

按预期工作。使用非基本类型时会出现我的问题,如下例所示:

int main() {
  A<std::complex<int>> c;
  c = std::complex<int>(2, 2);  
  std::cout << c << "\n";
}

上面的 sn-p 引发了 invalid operands to binary expression 错误。

为什么会出现这个错误?为什么std::complex&lt;int&gt; 的重载运算符&lt;&lt; 不与隐式转换的A&lt;std::complex&lt;int&gt;&gt; 一起使用?

【问题讨论】:

标签: c++ template-argument-deduction


【解决方案1】:

std::complex 的流操作符是模板函数。除非您实际拥有std::complex,否则不会调用它们,因为模板参数推导中不会发生任何转换。这意味着编译器将找不到合适的重载来打印A&lt;std::complex&lt;int&gt;&gt;

您是第一个工作案例,因为 std::basic_ostream::operator &lt;&lt; 被重载以采用 int 并且您被允许一个用户定义的转换是重载解决方案。


作为一种工作方式,您可以定义自己的operator &lt;&lt;,它将您的包装器转发到底层类型的operator &lt;&lt;。看起来像

template<typename T>
std::ostream& operator <<(std::ostream& os, const A<T>& a)
{
    return os << static_cast<T>(a);
}

【讨论】:

  • 非常感谢!是否有任何解决方法可以实现我计划获得的行为?
  • @datell,最简单的解决方法是定义template &lt;typename T&gt; operator&lt;&lt;(std::ostream&amp;, A&lt;T&gt; const&amp;);
  • @datell 我已经在答案中添加了一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2018-08-20
相关资源
最近更新 更多