#include< iostream >
using namespace::std;
int foo(); //function with no argument
int foo(int=10); //Default argument
int foo()
{
cout<<"\n Foo , I am foo \n";
return 0;
}
int foo(int f)
{
cout<<"\n I am Foo too.\n";
return 0;
}
int main()
{
foo();
foo(2);
cin.get();
return 0;
}
Какой смысл иметь перегрузку без аргументов, когда есть перегрузка с аргументом по умолчанию? Если это совершенно другая функция, у нее должно быть другое имя.
Я хочу знать, есть ли способ вызвать foo ()?
Исправить код тривиально. Удалите =10
.
Перегрузка функций - это возможность вызывать функции с одинаковыми именами на основе их списков аргументов. Наличие двух функций с одинаковым именем и одинаковыми списками аргументов просто не подходит для перегрузки. Вы получили ответы, которые показывают, как вы можете это сделать; гораздо проще дать им разные имена. Другими словами, замените static_cast<int(*)()>(foo)()
на bar()
.
вы ищете функцию с переменным списком аргументов? см. stackoverflow.com/questions/1657883/…
Существенный вопрос - две функции, по сути, делают одно и то же? В таком случае не следует указывать аргумент по умолчанию во втором объявлении. Если они делают разные вещи, вам нужно переименовать один или дать нам вескую причину, по которой у них должно быть одинаковое имя.
Вы можете явно указать указатель на функцию, но не уверены, что нужно.
#include <iostream>
using namespace::std;
int foo(); //function with no argument
int foo(int=10); //Default argument
int foo()
{
cout<<"\n Foo , I am foo \n";
return 0;
}
int foo(int f)
{
cout<<"\n I am Foo too.\n";
return 0;
}
int main()
{
static_cast<int(*)()>(foo)();
foo(2);
cin.get();
return 0;
}
редактировать:
Эта строка static_cast<int(*)()>(foo)();
- это просто сокращенная форма приведения и вызова функции.
Чтобы объяснить это, мы можем разделить его на 3 этапа:
Определите myFuncType как указатель на функцию, которая возвращает int и не принимает аргументов
using myFuncType = int(*)();
Разрешите перегруженное имя foo, приведя его к типу функции, которая не принимает аргументов, и сохраните его в переменной с именем f
auto f = static_cast<myFuncType>(foo);
// or auto f = (myFuncType)foo;
// or auto f = (myFuncType)&foo; C++ actually does the address-of implicitly with functions
Последний вызывает указатель на функцию
f(); //or (*f)(); C++ automatically dereferences function pointer on call, but you can also manually dereference
static_cast <int (*) ()> (foo) (); не могли бы вы объяснить?
Я добавил еще несколько пояснений
Нет чистых способов сделать это, есть только уродливые. Такие как:
static_cast<int (*)()>(&foo)();
Или:
int (*p)() = &foo;
(*p)();
Суть в том, что вы не можете полагаться на разрешение перегрузки из-за двусмысленности. Следовательно, вам нужно явно однозначно разрешить символ, используя такой подход.
Предпочтительное решение - в первую очередь избегать неоднозначных перегрузок. Обычно можно найти какой-нибудь разумный способ сделать это, но способ этого зависит от фактических деталей.
Непонятно, почему в двух объявлениях функций используется одно и то же имя. Вы должны делать это только в том случае, если они должны «делать то же самое».
Если две функции должны делать одно и то же, тогда:
Когда вы указываете аргумент функции по умолчанию, вы получаете дополнительную сигнатуру функции. Таким образом,
int foo(int arg=10);
также дает вам
int foo();
Он говорит, что с * любой звонок " "для foo()
значение arg равно 10
.
Но затем вы добавили дополнительный int foo();
, который возвращает 0
, что сбивает компилятор с толку. На более абстрактном уровне вы фактически запутали сам относительно того, что является аргументом по умолчанию для «вещи», которую должна делать ваша функция.
Если две функции не делают одно и то же, у них не должно быть одного и того же имени. Это можно сделать несколькими способами:
Избавьтесь от аргумента по умолчанию.