这个问题已经有了答案:
我有一个结构作为其他类型的包装器,如下所示:
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 错误。
invalid operands to binary expression
为什么会发生这种错误?为什么超载的操作员不 << 属于 std::complex<int> 用于隐式转换的 A<std::complex<int>> 是吗?
<<
std::complex<int>
A<std::complex<int>>
流运算符 std::complex 是模板函数。除非您实际拥有 STD::复合物 因为模板参数推导中没有转换。这意味着编译器将找不到合适的重载来打印 A<std::complex<int>>
std::complex
STD::复合物
你是第一个工作的人,因为 std::basic_ostream::operator << 超负荷接受 int 并且您可以使用一个用户定义的转换来实现过载解析。
std::basic_ostream::operator <<
int
作为一项工作,你可以定义自己的 operator << 将包装器带到底层类型' 操作员<< .看起来像是
operator <<
操作员<<
template<typename T> std::ostream& operator <<(std::ostream& os, const A<T>& a) { return os << static_cast<T>(a); }