Преобразование типов из std :: complex <MyType>в std :: complex <double> - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть класс MyType, который реализует пользовательский арифметический тип c. Этот класс предоставляет следующий оператор преобразования

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

Любая помощь для решения этой проблемы приветствуется.

Matthias

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Специализации std::complex<float>, std::complex<double> и std::complex<long double> являются литеральными типами для представления и обработки комплексных чисел.

Эффект создания шаблона для любого другого типа не определен.

Таким образом, std::complex<MyType> является «проблематичным c» ...

Игнорируя эту часть,

, тогда как std::complex<T> имеет общие c конструктор преобразования, специализация std::complex<double> обеспечивает преобразование только из других плавающих сложных версий.

Но operator= допускает преобразование generic c для всех версий (только Msv c принимает код , хотя).

Вы должны предоставить свою собственную (явную / именованную) функцию преобразования:

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 голосов
/ 29 апреля 2020

Помогает ли это (не особенно элегантное) обходное решение?

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

Я перепробовал все виды различных конструкторов и операторов присваивания std::complex, но не нашел более "неявного" способа преобразования.

Я думаю, что это связано: Почему функция преобразования не работает с std :: string?

...