从std::complex<MyType>到std::complex<double&gt的类型转换。

问题描述 投票:2回答:1

我有一个类 MyType 的类,实现了用户定义的算术类型。该类提供了以下转换运算符

struct MyType 
{ ...
  operator double()
  { 
    return to_double(); // This converts my type to a double value
  }
... };

按照下面的方式使用这个类就可以了。

double d = MyType(1);

但是,在std::complex中使用这个类作为类型,例如

#include <complex>
std::complex<double> c = std::complex<MyType>(1,1);

失败,出现以下编译器错误。

error: conversion from 'std::complex<MyType>' to non-scalar type 'std::complex<double>' requested

如果能帮助解决这个问题,我将不胜感激。

马蒂亚斯

c++ c++11 c++14 c++17
1个回答
3
投票

特殊化 std::complex<float>, std::complex<double>std::complex<long double> 是用于表示和操作复数的LiteralTypes。

对任何其他类型的复数实例化模板的效果是不明确的。

所以 std::complex<MyType> 是 "有问题 "的...

忽略这部分。

std::complex<T> 有通用的转换构造函数,特殊化 std::complex<double> 只提供其他浮动复杂版本的转换。

但是 operator= 允许所有版本的通用转换(只有Msvc接受 编码 不过)。)

你必须提供你自己的(显式命名)转换函数。

std::complex<double> to_complex_double(std::complex<MyType>& c)
{
#if 0
     std::complex<double> res;
     res = c; // gcc/clang doesn't accept that.
     return res;
#else
     return {c.real(), c.imag()};
#endif
}

0
投票

这个(不是特别优雅的)变通方法有帮助吗?

std::complex<MyType> dummy(1,1);
std::complex<double> c1(
    static_cast<double>(dummy.real()), static_cast<double>(dummy.imag()));

我试过了各种不同的构造函数以及 std::complex 但没有找到更 "隐性 "的转换方式。

我想这是有关系的。为什么转换函数不能用于std: string?

© www.soinside.com 2019 - 2024. All rights reserved.