C++ 你能解释这种重载解析行为吗?
此代码段不会使用VS2013或ICC 16编译:C++ 你能解释这种重载解析行为吗?,c++,C++,此代码段不会使用VS2013或ICC 16编译: class C2; class C1 { public: float x, y; template<typename T> C1 (T x, T y) : x(static_cast<float>(x)), y(static_cast<float>(y)) {}; C1 (const C2 &a, int i) : x(0), y(0) {}; }; void main() {
class C2;
class C1
{
public:
float x, y;
template<typename T>
C1 (T x, T y) : x(static_cast<float>(x)), y(static_cast<float>(y)) {};
C1 (const C2 &a, int i) : x(0), y(0) {};
};
void main()
{
C1 p(1.5, 2);
}
当多段线
可以转换为双
时,会出现什么情况
编辑
在阅读了第一个答案后,我将此示例简化为:
class PolyLine
{
public:
PolyLine(int i = 7) {};
};
标记
PolyLine
constructorexplicit
会产生所需的效果 您正在尝试调用C1::C1(double,int)
。可以找到两个名称:
template <typename T> C1::C1(T, T);
C1::C1(const C2&, int);
作为转换序列的一部分,我们可以执行零或一个标准转换以及零或一个用户定义的转换double-->int
是允许的标准转换,int-->PolyLine
是允许的用户定义转换
因此,
C1::C1(const PolyLine&,int)
是一个可行的构造函数。因为它是唯一可行的构造函数,所以它是最好的可行构造函数 如果您的问题是隐式的double
到Polyline
,您可以将构造函数标记为显式的:
explicit PolyLine (int initLength = INIT_LENGTH);
@巴里:是的,我不想编译它。这个角色对我来说完全是个惊喜,我不想把double
角色转换成PolyLine
——这毫无意义。我将多段线(int)
构造函数标记为显式,以防止@Dani建议的情况发生。我的问题是关于解释这种行为,你做得很好,谢谢。
PolyLine (int );
explicit PolyLine (int initLength = INIT_LENGTH);