C++创建头文件时多个重载函数实例匹配参数列表
C++ more than one instance of overloaded function matches the argument list when creating a header file
在我的程序主文件中,我有以下声明
int main()
{
Customer c;
Part p;
Builder b;
auto partsVec = readpartFile();
auto customerVec = readcustomerFile();
auto builderVec = readbuilderFile();
fexists("Parts.txt");
complexity(c, partsVec);
robotComplexity(partsVec,customerVec);
writeFile(buildAttempt(b, complexity(c, partsVec), variability(customerVec, builderVec)));
}
我的头文件包含以下内容
vector<Part> readpartFile();
vector<Customer> readcustomerFile();
vector<Builder> readbuilderFile();
float complexity(const Customer& c, const std::vector<Part>& parts);
void robotComplexity(vector<Part> vecB, vector<Customer> vecC);
double variability(const vector<Customer>& customerList, const vector<Builder>& builderList);
vector<double> buildAttempt(Builder b, double variaiblity, double complexityRobot);
void writeFile(vector<double> build);
除了 robotComplexity 之外的所有功能 link。我在 main 中声明此函数会产生以下错误。
重载函数 "robotComplexity" 的多个实例与参数列表匹配: -- 函数 "robotComplexity(const std::vector> &parts, const std::vector> &customers)" -- 函数 "robotComplexity(std::vector> vecB, std::vector> vecC)" -- 参数类型是:(std::vector >, std::vector>)
我不确定为什么会收到此错误或如何解决它
header 中的声明与定义(也用作声明)不匹配:
void robotComplexity(vector<Part> vecB, vector<Customer> vecC);
void robotComplexity(const vector<Part>& vecB, const vector<Customer>& vecC);
虽然参数名称可以不匹配,但类型不应该,否则,您会创建另一个重载。
Jarod42 的回答非常正确,但我想补充一点,为将来的 C++ 编码提供有用的方法。
当函数签名不同时,编译器不会报错。充其量,您将收到一个神秘的或难以阅读的链接器错误。这在继承和虚函数中尤其常见。更糟糕的是,有时它们会工作,但实际上会在与基础 class 不匹配的子 class 上调用具有不同签名的新函数。
C++11(及更新版本)中有一个关键字叫做override。以下是关于关键字作用的更深入讨论:OverrideKeywordLink
当此关键字用于虚函数时,当预期的虚函数覆盖与基础 class 函数签名不匹配时,它会变成 编译错误 。此外,它还提供了一个非常易于理解的原因,说明为什么未发生函数覆盖。
您在评论中提到“const 为什么让它与众不同”?答案是这一切都归结为函数签名。考虑 class 中的这两个函数。
class MyClass {
int CalculateSomething();
int CalculateSomething() const;
}
const 实际上改变了函数签名。它们被认为是两种不同的功能。最重要的是,始终尝试使编译错误超过 运行 次错误。使用关键字来保护您免受一些存在的 C++ 知识陷阱的影响。
在我的程序主文件中,我有以下声明
int main()
{
Customer c;
Part p;
Builder b;
auto partsVec = readpartFile();
auto customerVec = readcustomerFile();
auto builderVec = readbuilderFile();
fexists("Parts.txt");
complexity(c, partsVec);
robotComplexity(partsVec,customerVec);
writeFile(buildAttempt(b, complexity(c, partsVec), variability(customerVec, builderVec)));
}
我的头文件包含以下内容
vector<Part> readpartFile();
vector<Customer> readcustomerFile();
vector<Builder> readbuilderFile();
float complexity(const Customer& c, const std::vector<Part>& parts);
void robotComplexity(vector<Part> vecB, vector<Customer> vecC);
double variability(const vector<Customer>& customerList, const vector<Builder>& builderList);
vector<double> buildAttempt(Builder b, double variaiblity, double complexityRobot);
void writeFile(vector<double> build);
除了 robotComplexity 之外的所有功能 link。我在 main 中声明此函数会产生以下错误。
重载函数 "robotComplexity" 的多个实例与参数列表匹配: -- 函数 "robotComplexity(const std::vector> &parts, const std::vector> &customers)" -- 函数 "robotComplexity(std::vector> vecB, std::vector> vecC)" -- 参数类型是:(std::vector >, std::vector>)
我不确定为什么会收到此错误或如何解决它
header 中的声明与定义(也用作声明)不匹配:
void robotComplexity(vector<Part> vecB, vector<Customer> vecC);
void robotComplexity(const vector<Part>& vecB, const vector<Customer>& vecC);
虽然参数名称可以不匹配,但类型不应该,否则,您会创建另一个重载。
Jarod42 的回答非常正确,但我想补充一点,为将来的 C++ 编码提供有用的方法。
当函数签名不同时,编译器不会报错。充其量,您将收到一个神秘的或难以阅读的链接器错误。这在继承和虚函数中尤其常见。更糟糕的是,有时它们会工作,但实际上会在与基础 class 不匹配的子 class 上调用具有不同签名的新函数。
C++11(及更新版本)中有一个关键字叫做override。以下是关于关键字作用的更深入讨论:OverrideKeywordLink
当此关键字用于虚函数时,当预期的虚函数覆盖与基础 class 函数签名不匹配时,它会变成 编译错误 。此外,它还提供了一个非常易于理解的原因,说明为什么未发生函数覆盖。
您在评论中提到“const 为什么让它与众不同”?答案是这一切都归结为函数签名。考虑 class 中的这两个函数。
class MyClass {
int CalculateSomething();
int CalculateSomething() const;
}
const 实际上改变了函数签名。它们被认为是两种不同的功能。最重要的是,始终尝试使编译错误超过 运行 次错误。使用关键字来保护您免受一些存在的 C++ 知识陷阱的影响。