C ++ более одного экземпляра перегруженной функции соответствует списку аргументов при создании файла заголовка - PullRequest
1 голос
/ 19 апреля 2020

В моем основном файле моей программы у меня есть следующие объявления

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. Мое объявление этой функции в main создает следующую ошибку.

более одного экземпляра перегруженной функции "robotComplexity" соответствует списку аргументов: - функция "robotComplexity (const std :: vector> & parts, const std :: vector> & Customers)" - function "robotComplexity ( std :: vector> vecB, std :: vector> ve cC) "- типы аргументов: (std :: vector>, std :: vector>)

я не уверен, почему я получаю это ошибка или как ее решить

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

У вас есть несоответствие между объявлением в заголовке и определением (которое также служит объявлением):

  • void robotComplexity(vector<Part> vecB, vector<Customer> vecC);
  • void robotComplexity(const vector<Part>& vecB, const vector<Customer>& vecC);

В то время как имена параметров могут не совпадать, типы не должны, в противном случае вы создаете еще одну перегрузку.

1 голос
/ 19 апреля 2020

Ответ Jarod42 довольно правильный, но я хочу добавить к нему и предоставить полезную методологию для будущего C ++ кодирования.

Если сигнатуры функций различаются, компилятор не будет жаловаться. В лучшем случае вы получите крипт c или трудно читаемую ошибку компоновщика. Это особенно характерно для наследования и виртуальных функций. Хуже того, иногда они работают, но на самом деле вызывают новую функцию с другой сигнатурой в дочернем классе, которая не соответствует базовому классу.

В C ++ 11 (и более новых версиях) есть ключевое слово override . Вот более подробное обсуждение того, что делает ключевое слово: OverrideKeywordLink

Когда это ключевое слово используется в виртуальной функции, оно становится ошибка компиляции , когда предполагаемое Переопределение виртуальной функции не соответствует сигнатуре функции базового класса. Кроме того, это дает очень понятную человеку причину, по которой переопределение функции не произошло.

Вы упомянули в комментарии, что «почему const сделал его другим»? Ответ в том, что все сводится к сигнатурам функций. Рассмотрим эти две функции внутри класса.

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

const фактически изменяет сигнатуру функции. Они рассматриваются как две разные функции. Суть в том, что всегда старайтесь делать ошибки, компилируйте ошибки из-за ошибок во время выполнения. Используйте ключевые слова, которые защищают вас от нескольких существующих ловушек знаний C ++.

...