当前位置: 首页 > 知识库问答 >
问题:

转换运算符到std::complex

危文乐
2023-03-14

下面的代码将泛型(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; 
}

共有1个答案

秦涵涤
2023-03-14

doublefloatlong 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