C++ 你能解释这种重载解析行为吗?

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() {

此代码段不会使用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()
{
    C1 p(1.5, 2);
}
多段线
可以转换为
时,会出现什么情况

编辑

在阅读了第一个答案后,我将此示例简化为:

class PolyLine 
{
public:
  PolyLine(int i = 7) {};
};

标记
PolyLine
constructor
explicit
会产生所需的效果

您正在尝试调用
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);