&引用;重载函数的调用不明确;(转换构造函数C+;+;) 我试图在C++点类中实现一个转换构造函数,并且我收到的错误是“重载函数调用不明确”。这是什么意思?看着我的导师如何在她的程序中实现转换构造函数,我看不出我做错了什么
以下是头文件中的代码:&引用;重载函数的调用不明确;(转换构造函数C+;+;) 我试图在C++点类中实现一个转换构造函数,并且我收到的错误是“重载函数调用不明确”。这是什么意思?看着我的导师如何在她的程序中实现转换构造函数,我看不出我做错了什么,c++,class,constructor,C++,Class,Constructor,以下是头文件中的代码: Point(int n); 下面是类文件中的代码: //conversion constructor - initializes the data members from a 4 digit integer number //(yyxx). If the number is less than 3 digits, set the data members to 0. Point::Point(int n) { int numDigits = 1;
Point(int n);
下面是类文件中的代码:
//conversion constructor - initializes the data members from a 4 digit integer number
//(yyxx). If the number is less than 3 digits, set the data members to 0.
Point::Point(int n)
{
int numDigits = 1;
int temp = n; //temp variable to manipulate n while finding numDigits
//while loop to find out how many digits
while(temp/10 > 0)
{
numDigits++;
temp = temp/10;
}
if(numDigits < 3)
{
x = 0;
y = 0;
}
else if(numDigits == 3)
{
x = n%10;
y = n/10;
}
else //must be 4 digits
{
int y1 = n/10/10/10%10;
int y2 = n/10/10%10;
int x1 = n/10%10;
int x2 = n%10;
stringstream ss;
ss << y1 << y2;
string intStr1 = ss.str();
ss << x1 << x2;
string intStr2 = ss.str();
x = std::stoi(intStr2);
y = std::stoi(intStr1);
}
}
您的构造函数相互冲突:
Point::Point(int x = 0, int y = 0);
Point::Point(int n);
编译器无法选择调用哪一个。
也许,一些分离将有助于:
Point::Point(); // default
Point::Point(int x, int y);
Point::Point(int n);
您的构造函数相互冲突:
Point::Point(int x = 0, int y = 0);
Point::Point(int n);
编译器无法选择调用哪一个。
也许,一些分离将有助于:
Point::Point(); // default
Point::Point(int x, int y);
Point::Point(int n);
除了剩下的问题:
else if(numDigits=3)
。这是一个最终会咬到你的打字错误:)。理想情况下,您的IDE应该在此处显示警告。此时很难告诉您问题所在。如果重载是不明确的,这意味着必须至少有另一个构造函数,这里没有显示。此外,错误消息还包含有关编译器尝试但无法确定的其他可能构造函数的有用信息。因此,在帖子中加入这些内容将是一个好主意。@YanickSalzmann感谢您指出我修正了==。我用完整的错误信息编辑了这篇文章,它似乎说我所有的构造器都是“候选者”。编辑:还想指出的是,我自己测试了所有其他构造函数,除了转换构造函数之外,其他一切都在工作。当您调用point(123)
两个构造函数调用匹配时:point(int)
和point(int=0,int=0)
。第二个版本匹配,因为第二个参数具有默认值0
,所以它相当于调用点p(123,0)
。只需删除点(int)
定义。好了,那么点(int=0,int=0)就可以成为我的默认、参数化和转换构造函数了?除了你的其余问题:否则如果(numDigits=3)
。这是一个最终会咬到你的打字错误:)。理想情况下,您的IDE应该在此处显示警告。此时很难告诉您问题所在。如果重载是不明确的,这意味着必须至少有另一个构造函数,这里没有显示。此外,错误消息还包含有关编译器尝试但无法确定的其他可能构造函数的有用信息。因此,在帖子中加入这些内容将是一个好主意。@YanickSalzmann感谢您指出我修正了==。我用完整的错误信息编辑了这篇文章,它似乎说我所有的构造器都是“候选者”。编辑:还想指出的是,我自己测试了所有其他构造函数,除了转换构造函数之外,其他一切都在工作。当您调用point(123)
两个构造函数调用匹配时:point(int)
和point(int=0,int=0)
。第二个版本匹配,因为第二个参数具有默认值0
,所以它相当于调用点p(123,0)
。只需删除点(int)定义。那么点(int=0,int=0)就可以成为我的默认、参数化和转换构造函数了?