C ++ напутал: необязательный аргумент вынужден быть обязательным

Я хочу иметь функцию с необязательным аргументом. Однако VC ++ выдает ошибку, которую я не могу понять. Код так же прост:

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

void myFunction(string something, int w);

int main()
{
myFunction("a string");

int a = 1;
}

void myFunction(string something, int w = 5)
{
cout << something << " - " << w << endl;
}

Жалуется:

'myFunction': function does not take 1 arguments

Тем не менее, если я переместить myFunction () перед main (), это не выдаст ошибку. Что здесь происходит? Пожалуйста помоги. Спасибо.

0

Решение

Эта ошибка вызвана тем, что у вас есть дополнительные переменные при вызове вашей функции, но не в вашем объявлении.

Это создаст функцию с двумя переменными:

void myFunction(string something, int w);

Однако это сделает вторую переменную необязательной:

void myFunction(string something, int w=5);

Вам нужно, чтобы в объявлении была необязательная переменная.

Кроме того, я удивлен, что ваш компилятор не пытался наплевать на какую-то ошибку, связанную с переопределением. (Это может быть даже ошибка компилятора! Я буду в курсе исследований в этом. Обновить: Не похоже на ошибку компилятора, но определенно есть функция, которую я бы хотел иметь. Даже если бы это была ошибка, это было бы линкер связанные с.)

6

Другие решения

Некоторая терминология: это

void myFunction(string something, int w);

это декларация. это

void myFunction(string something, int w) {
// note the function body
}

обычно называется определение. Но это действительно оба, определение также как и декларация. Для простоты я буду продолжать называть это определение.

Ваша проблема в том, что порядок имеет значение, в частности порядок, в котором вы объявляете, определяете и вызываете свою функцию. На сайте звонка в main() единственная видимая декларация myFunction принимает строку и целое число и не имеет аргументов по умолчанию. В этот момент определение не видно, поэтому оно вообще не вступает в игру. Для компилятора это выглядит так, будто вы пытаетесь вызвать функцию, которой не существует.

Есть два решения:

  1. Переместите аргумент по умолчанию из определения в объявление. Это обычный способ сделать это. В большинстве случаев у вас есть объявление (включая любые аргументы по умолчанию) в файле заголовка и соответствующее определение (без аргументов по умолчанию) в файле cpp, которое #include заголовок.
  2. Избавьтесь от декларации и перенесите определение выше main(), Это работает, потому что определение также является декларацией.

В этом простом примере оба одинаково действительны.

Для определения аргументы по умолчанию не имеют значения. Неважно, если вы получите 5 потому что кто-то явно набрал его на сайте вызова или если компилятор добавил его через аргумент по умолчанию. Вот почему, когда у вас есть отдельное объявление и определение, аргумент по умолчанию необходим только для объявления. Вы можете и должны оставить это вне определения. В противном случае вы должны поддерживать его в двух местах без уважительной причины.

0

По вопросам рекламы [email protected]