C++ 为什么调用重载';函数(std::string)和#x27;这是不明确的吗?

C++ 为什么调用重载';函数(std::string)和#x27;这是不明确的吗?,c++,C++,代码如下。由于参数的数量不同,因此调用不应含糊不清。其中一个构造函数接受一个字符串和另一个字符串加整数。为什么我会出错 #include <iostream> #include <string> using namespace std; class AmbiguosCheck { public: AmbiguosCheck(string checkId = string(""), int length = 0) : checkId_(checkId), length

代码如下。由于参数的数量不同,因此调用不应含糊不清。其中一个构造函数接受一个字符串和另一个字符串加整数。为什么我会出错

#include <iostream>
#include <string>

using namespace std;

class AmbiguosCheck {

public:
AmbiguosCheck(string checkId = string(""),
int length = 0) :
checkId_(checkId),
length_(length){}

AmbiguosCheck(string xmlstring)
{
fromStringForInternalTransfer(xmlstring);
}

string checkId_;
int length_;

string toStringForInternalTransfer(){
return checkId_ + "|" + to_string(length_);
}

void fromStringForInternalTransfer(string xmlstring)
{
checkId_ = xmlstring; //Using simple assigment for sample code. Need to split, convert and assign the values.
length_ = 20;
}
};

int main()
{
AmbiguosCheck bd((string)"Check ID|20.000");
}

为什么还有两个候选的歧义?

第一个构造函数为第二个
int
参数指定了一个默认值。因此可以忽略这一点,这样就剩下两个构造函数,这两个构造函数都可以用一个
std::string
参数调用。这确实是模棱两可的


要解决此问题,您可以删除
=0
默认参数,方法是将整数第二个参数作为(非默认的)
std::optional
(需要C++17)传递,或者使用命名的静态工厂函数。

第一个构造函数为第二个
int
参数指定默认值。因此可以忽略这一点,这样就剩下两个构造函数,这两个构造函数都可以用一个
std::string
参数调用。这确实是模棱两可的

要解决此问题,您可以删除
=0
默认参数,方法是将整型第二个参数作为(非默认)
std::optional
(需要C++17)传递,或者使用命名的静态工厂函数

歧义检查(字符串检查ID=string(“”), 整数长度=0) 含糊不清(字符串xmlstring)

因此,如果您有
模糊scheck(myString)
要调用哪个

AmbiguosCheck(myString, 0); // first constructor, because length = 0 default
AmbiguosCheck(myString); // second single argument constructor
拥有第二个构造函数真的有意义吗?如果
length=0
是正确的默认值,只需保留该值即可

否则,可能会删除默认值,并使用默认构造函数

AmbiguosCheck() { ... }
AmbiguosCheck(string xmlstring) { ... }
AmbiguosCheck(string checkId, int length) { ... }
都可以毫不含糊地称之为

AmbiguosCheck a; // default constructor ()
AmbiguosCheck b(myString); // string
AmbiguosCheck c(myString, n); // string, int
歧义检查(字符串检查ID=string(“”), 整数长度=0) 含糊不清(字符串xmlstring)

因此,如果您有
模糊scheck(myString)
要调用哪个

AmbiguosCheck(myString, 0); // first constructor, because length = 0 default
AmbiguosCheck(myString); // second single argument constructor
拥有第二个构造函数真的有意义吗?如果
length=0
是正确的默认值,只需保留该值即可

否则,可能会删除默认值,并使用默认构造函数

AmbiguosCheck() { ... }
AmbiguosCheck(string xmlstring) { ... }
AmbiguosCheck(string checkId, int length) { ... }
都可以毫不含糊地称之为

AmbiguosCheck a; // default constructor ()
AmbiguosCheck b(myString); // string
AmbiguosCheck c(myString, n); // string, int


您有两个构造函数可以接受单个
std::string
参数(接受
int
参数的构造函数将
std::string
int
参数都作为可选参数)。应该使用哪一个?这是否回答了您的问题?我现在明白了,为什么我会出错。但我不知道如何解决这个问题。因为字符串在两个函数中的含义不同。在这种情况下,AmbiguosCheck(string,int)将其直接赋值给成员变量。当使用AmbiguosCheck(xmlstring)时,我希望拆分字符串并在转换后赋值。我在示例代码中没有这样做。也许您应该重新考虑导致此代码的设计?例如,通过创建一个小型继承层次结构,其中有两个子类,每个子类实现一种方式?或者可能实现某种工厂函数(或一对工厂函数)来创建对象?我将进一步挖掘。您有两个构造函数,可以接受单个
std::string
参数(接受
int
参数的构造函数将
std::string
int
参数作为可选参数)。应该使用哪一个?这是否回答了您的问题?我现在明白了,为什么我会出错。但我不知道如何解决这个问题。因为字符串在两个函数中的含义不同。在这种情况下,AmbiguosCheck(string,int)将其直接赋值给成员变量。当使用AmbiguosCheck(xmlstring)时,我希望拆分字符串并在转换后赋值。我在示例代码中没有这样做。也许您应该重新考虑导致此代码的设计?例如,通过创建一个小型继承层次结构,其中有两个子类,每个子类实现一种方式?或者可能实现某种工厂函数(或一对工厂函数)来创建对象?我将进一步挖掘。我现在明白了为什么会出现错误。但我不知道如何解决这个问题。因为字符串在两个函数中的含义不同。在这种情况下,AmbiguosCheck(string,int)将其直接赋值给成员变量。当使用AmbiguosCheck(xmlstring)时,我希望拆分字符串并在转换后赋值。我在示例代码中没有这样做。那么使用没有默认参数的表单,如果希望
int
版本为零,那么只需显式地执行
AmbiguosCheck(myString,0)
,但是需要显式地将它们区分开来,编译器无法从其他上下文中猜测。另一个可能不那么令人困惑的选择是:我现在明白了,为什么我会出错。但我不知道如何解决这个问题。因为字符串在两个函数中的含义不同。在这种情况下,AmbiguosCheck(string,int)将其直接赋值给成员变量。当使用AmbiguosCheck(xmlstring)时,我希望拆分字符串并在转换后赋值。我在示例代码中没有这样做。那么使用没有默认参数的表单,如果希望
int
版本为零,那么只需显式地执行
AmbiguosCheck(myString,0)
,但是需要显式地将它们区分开来,编译器无法从其他上下文中猜测。另一个可能不那么令人困惑的选择是:我现在明白了,为什么我会出错。但我不知道如何解决这个问题。因为字符串在两个函数中的含义不同。在这种情况下,AmbiguosCheck(string,int)将其直接赋值给成员变量。当使用AmbiguosCheck(xmlstring)时,我希望拆分字符串并在转换后赋值。我在示例代码中没有这样做。好吧,我试着给你三个选项来解决这个问题。你能具体说明你不明白这些建议的哪一部分吗