【发布时间】:2015-07-06 15:33:37
【问题描述】:
我有两个 C++ 结构,Rect 是浮点矩形,iRect 相同,但使用整数:
struct iRect {
int X;
int Y;
int W;
int H;
};
struct Rect {
float X;
float Y;
float W;
float H;
};
目前我可以使用 Rect{1.2, 2.4, 4.2, 0.2}; 语法构造这些。
现在我想让这些隐式转换,所以我为 Rect 创建一个新的构造函数:
Rect(iRect iR) {
X = (float)iR.X;
Y = (float)iR.Y;
W = (float)iR.W;
H = (float)iR.H;
}
我得到:error C2512: 'Rect' : no appropriate default constructor available
没什么大不了的,我只定义一个空的默认构造函数。
但现在我得到error C2440: 'initializing' : cannot convert from 'initializer-list' to 'Rect'
所以我必须为四个浮点数、三个浮点数、两个浮点数和一个浮点数定义另一个构造函数,以具有与以前相同的行为。这个例子也被简化了: Rect 实际上也是两个Vec2 类型的联合,所以我还必须为Rect (Vec2 a, Vec2 b) 定义一个构造函数。
通常所有这些构造函数都是由编译器生成的。我有什么方法可以定义我的 Rect(iRect iR) 构造函数而不阻止编译器生成所有其他构造函数?
【问题讨论】:
-
你为什么不为此使用类?
-
您可以使用转换函数 (
operator Rect() const;),而不是转换构造函数。虽然我认为这是一个 xy 问题 -
This 可能会有所帮助。
-
把
Rect改成template<class T> class Rect {};可以减少很多重复代码。 -
@LawrenceAiello
struct是class,只是具有不同的默认成员访问权限。
标签: c++ constructor