C++ 创建头文件时,多个重载函数实例与参数列表匹配

Posted

技术标签:

【中文标题】C++ 创建头文件时,多个重载函数实例与参数列表匹配【英文标题】:C++ more than one instance of overloaded function matches the argument list when creating a header file 【发布时间】:2020-04-19 05:23:33 【问题描述】:

在我的程序的主文件中,我有以下声明

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);

除 robotsComplexity 外,所有功能都链接在一起。我在 main 中声明此函数会产生以下错误。

重载函数“robotComplexity”的多个实例与参数列表匹配: -- function "robotComplexity(const std::vector> &parts, const std::vector> &customers)" -- function "robotComplexity(std:: vector> vecB, std::vector> vecC)" -- 参数类型为:(std::vector>, std::vector>)

我不知道为什么我会收到此错误或如何解决它

【问题讨论】:

【参考方案1】:

标题中的声明和定义(也用作声明)不匹配:

void robotComplexity(vector&lt;Part&gt; vecB, vector&lt;Customer&gt; vecC); void robotComplexity(const vector&lt;Part&gt;&amp; vecB, const vector&lt;Customer&gt;&amp; vecC);

虽然参数名称可能不匹配,但类型不应该匹配,否则,您会创建另一个重载。

【讨论】:

啊,好的,解决了。为什么将其设为 const 会产生不同的影响 const std::vector&lt;Part&gt;&amp;std::vector&lt;Part&gt;是不同的参数类型,前者是const引用传递,后者是值传递,所以创建一个副本。 如果我通过消息和你交谈可以吗? 你的问题是什么? 当我运行代码时,我得到了错误。如果您愿意,我可以将它们放在一个文件中,但有一些我不确定【参考方案2】:

Jarod42 的答案非常正确,但我想补充一点,并为未来的 C++ 编码提供有用的方法。

当函数签名不同时,编译器不会抱怨。充其量,您将收到一个神秘的或难以阅读的链接器错误。这在继承和虚函数中尤其常见。更糟糕的是,有时它们会起作用,但实际上会在与基类不匹配的子类上调用具有不同签名的新函数。

在 C++11(和更新版本)中有一个名为 override 的关键字。以下是关于他们关键字作用的更深入讨论:OverrideKeywordLink

在虚函数上使用此关键字时,当预期的虚函数覆盖与基类函数签名不匹配时,它会变成编译错误。此外,它给出了一个非常易于理解的原因,为什么没有发生函数覆盖。

您在评论中提到“为什么 const 使它与众不同”?答案是这一切都归结为函数签名。考虑一个类中的这两个函数。

class MyClass 
    int CalculateSomething();
    int CalculateSomething() const;

const 实际上改变了函数签名。它们被认为是两种不同的功能。底线是,总是试图让错误编译错误超过运行时错误。使用可以保护您免受一些存在的一些部落 C++ 知识陷阱的关键字。

【讨论】:

以上是关于C++ 创建头文件时,多个重载函数实例与参数列表匹配的主要内容,如果未能解决你的问题,请参考以下文章

多个重载函数 to_string 实例与参数列表匹配

std::to_string - 多个重载函数的实例与参数列表匹配

没有重载函数的实例匹配参数列表 C++

没有重载函数“AfxBeginThread”的实例与参数列表匹配

重载重写隐藏

函数重载