代码之家  ›  专栏  ›  技术社区  ›  dtell

对隐式转换的非基本数据类型[重复]使用运算符<<时出错

  •  6
  • dtell  · 技术社区  · 8 年前

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

    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";
    }
    

    上面的代码片段引发了 invalid operands to binary expression 错误。

    为什么会发生这种错误?为什么超载的操作员不 << 属于 std::complex<int> 用于隐式转换的 A<std::complex<int>> 是吗?

    1 回复  |  直到 8 年前
        1
  •  6
  •   NathanOliver    8 年前

    流运算符 std::complex 是模板函数。除非您实际拥有 STD::复合物 因为模板参数推导中没有转换。这意味着编译器将找不到合适的重载来打印 A<std::complex<int>>

    你是第一个工作的人,因为 std::basic_ostream::operator << 超负荷接受 int 并且您可以使用一个用户定义的转换来实现过载解析。


    作为一项工作,你可以定义自己的 operator << 将包装器带到底层类型' 操作员<< .看起来像是

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