6

我想知道我应该如何定义类 my_int 以便从 int 转换std::complex< my_int >为由编译器完成,而不是由我手动完成。

my_int如果 4 未强制转换为“ ” ,则以下程序无法编译

// 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;
}

我知道如果您使用它进行初始化cistd::complex<my_int> ci(4)但我希望它与复制初始化一起使用。

4

2 回答 2

2

您可以定义复杂的类并以这种方式编写构造函数。

  Complex(int re, int im = 0);

在这种情况下,编译器将隐式将 int 转换为 complex on

Complex c = 5;
于 2018-05-14T10:29:52.890 回答
1

表面上的问题是复制初始化上下文中不允许有多个用户定义的转换,可以通过使用直接初始化上下文来解决,例如

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

但是,还有另一个隐藏的问题:为,以外的任何类型实例化模板复合体的效果是未指定floatdoublelong double的,因此您必须明确专门化它,正如 StoryTeller 在评论中指出的那样。

于 2018-05-14T12:50:09.273 回答