下面的代码将泛型(POD)类型包装成(模板)类,并定义内部模板转换操作符,以便能够在兼容(但不同)类型之间进行隐式转换。我希望代码是相当自我解释的。在任何情况下,我都无法理解为什么将foo
转换为另一个POD都能正常工作,但将std::complex
(此处键入为cplx
)转换为std::complex
)却失败得很
error: call of overloaded 'complex(Foo<double>&)' is ambiguous
cplx z = (cplx)a;
有什么想法吗?代码如下:
#include <iostream>
#include <complex>
using cplx = std::complex<double>;
template <typename T>
class Foo // wrapper class for a POD
{
T val_; // this is the wrapped value
public:
Foo(T val = {}): val_(val) {};
template<typename S> // conversion operator
operator S ()
{
std::cout << "Calling conversion operator" << std::endl;
return val_;
}
// stream operator
friend std::ostream &operator<<(std::ostream &os, const Foo &rhs)
{
return os << rhs.val_;
}
};
int main()
{
Foo<double> a = 10.1;
// OK, calling the conversion operator double -> int
int i = 2 + (int)a;
// Calling conversion operator double -> cplx
// this line DOES NOT compile, why?!
// cplx z = (cplx)a;
}
有double
、float
和long double
构造函数可用于std::complex
。编译器不知道该使用哪个;它可以用其中任何一个实例化foo::operator s
。
如果选择其中一个,编译器可以填充其余的:
cplx z = (cplx)(double)a;
基本上,我希望我的范围类型可以从
C++ 运算符 强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。 大多数的 C++ 编译器都支持大部分通用的强制转换运算符: (type) expression 其中,type 是转换后的数据类型。下面列出了 C++ 支持的其他几种强制转换运算符: const_cast<type> (expr): const
问题内容: 如何将字符串转换成运算符plus?谢谢! 问题答案: 使用查找表:
字符串的运算符号怎么转换成js的表达式
如何访问使用关键字声明的此初始化程序的值? 在VS上给出以下编译错误: 二进制“[”:“std::initializer\u list”未定义此运算符或到预定义运算符可接受的类型的转换
问题内容: 我发现Java编译对于使用int和float的赋值和自赋值语句具有非预期的行为。 以下代码块说明了该错误。 在自赋值中,编译不会发出错误,但是求和的结果是带有值的int ,并且变量保持值。 在表达式中,编译器会发出一条错误消息 “错误:可能丢失精度” 。 有人可以解释这种行为。 编辑:我已经将此代码块发布在https://compilr.com/cguedes/java-autoass