将运算符<<与隐式转换的非基本数据类型一起使用时出错
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);
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 呼叫运营商<<临时
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- <<操作员在下面的行中工作
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它