Я хочу иметь функцию с необязательным аргументом. Однако 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 (), это не выдаст ошибку. Что здесь происходит? Пожалуйста помоги. Спасибо.
Эта ошибка вызвана тем, что у вас есть дополнительные переменные при вызове вашей функции, но не в вашем объявлении.
Это создаст функцию с двумя переменными:
void myFunction(string something, int w);
Однако это сделает вторую переменную необязательной:
void myFunction(string something, int w=5);
Вам нужно, чтобы в объявлении была необязательная переменная.
Кроме того, я удивлен, что ваш компилятор не пытался наплевать на какую-то ошибку, связанную с переопределением. (Это может быть даже ошибка компилятора! Я буду в курсе исследований в этом. Обновить: Не похоже на ошибку компилятора, но определенно есть функция, которую я бы хотел иметь. Даже если бы это была ошибка, это было бы линкер связанные с.)
Некоторая терминология: это
void myFunction(string something, int w);
это декларация. это
void myFunction(string something, int w) {
// note the function body
}
обычно называется определение. Но это действительно оба, определение также как и декларация. Для простоты я буду продолжать называть это определение.
Ваша проблема в том, что порядок имеет значение, в частности порядок, в котором вы объявляете, определяете и вызываете свою функцию. На сайте звонка в main()
единственная видимая декларация myFunction
принимает строку и целое число и не имеет аргументов по умолчанию. В этот момент определение не видно, поэтому оно вообще не вступает в игру. Для компилятора это выглядит так, будто вы пытаетесь вызвать функцию, которой не существует.
Есть два решения:
main()
, Это работает, потому что определение также является декларацией.В этом простом примере оба одинаково действительны.
Для определения аргументы по умолчанию не имеют значения. Неважно, если вы получите 5
потому что кто-то явно набрал его на сайте вызова или если компилятор добавил его через аргумент по умолчанию. Вот почему, когда у вас есть отдельное объявление и определение, аргумент по умолчанию необходим только для объявления. Вы можете и должны оставить это вне определения. В противном случае вы должны поддерживать его в двух местах без уважительной причины.