将运算符 << 与隐式转换的非基本数据类型一起使用时出错
Error when using operator << with implicitly converted non-fundamental data types
我有一个结构可以作为其他类型的包装器,如下所示:
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>>
一起使用?
std::complex
的流运算符是模板函数。它们不会被调用,除非你确实有一个 std::complex
因为在模板参数推导中没有发生转换。这意味着编译器将找不到合适的重载来打印 A<std::complex<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);
}
我有一个结构可以作为其他类型的包装器,如下所示:
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>>
一起使用?
std::complex
的流运算符是模板函数。它们不会被调用,除非你确实有一个 std::complex
因为在模板参数推导中没有发生转换。这意味着编译器将找不到合适的重载来打印 A<std::complex<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);
}