инициализация копирования - преобразование из int в нескалярный тип - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы знать, как определить класс my_int, чтобы преобразование из int в std::complex< my_int > выполнялось компилятором, а не вручную.

Следующая программа не компилируется, если 4 не приведено к "my_int"

// Example program
#include <iostream>
#include <string>
#include <complex>

struct my_int
{
    my_int() : _i(0) {}
    my_int(const my_int& mi) : _i(mi._i) {}

    my_int(int i) : _i(i) {}
    operator int(){return _i;}

    int _i;
};

std::ostream& operator<<(std::ostream& os, const my_int& mi)
{
    os << mi._i;
    return os;
}

int main()
{
  std::complex<my_int> ci = 4; // Casting 4 to my_int works

  std::cout << ci;
}

Я знаю, что если вы инициализируете ci с помощью std::complex<my_int> ci(4), это работает, но я хочу, чтобы оно работало с инициализацией копирования.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Кажущаяся проблема заключается в том, что более одного пользовательского преобразования не разрешено в контексте инициализации копирования , и это можно решить с помощью контекста прямой инициализации, например

std::complex<my_int> ci{4}; 

Однако , есть еще одна скрытая проблема: эффект создания комплекса шаблонов для любого типа, кроме float, double или long double, не указан , поэтомувы должны явно специализировать его, как указал StoryTeller в комментарии.

0 голосов
/ 14 мая 2018

Вы можете определить свой сложный класс и написать конструктор таким образом.

  Complex(int re, int im = 0);

В этом случае компилятор неявно преобразует int в complex на

Complex c = 5;
...