Я понял, что в вызове функции есть двусмысленность. Есть ли способ вызвать функцию foo ()?

#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;
}

Избавьтесь от аргумента по умолчанию.

drescherjm 27.10.2018 16:10

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

DeiDei 27.10.2018 16:11

Я хочу знать, есть ли способ вызвать foo ()?

Udesh 27.10.2018 16:14

Исправить код тривиально. Удалите =10.

Jesper Juhl 27.10.2018 16:14

Перегрузка функций - это возможность вызывать функции с одинаковыми именами на основе их списков аргументов. Наличие двух функций с одинаковым именем и одинаковыми списками аргументов просто не подходит для перегрузки. Вы получили ответы, которые показывают, как вы можете это сделать; гораздо проще дать им разные имена. Другими словами, замените static_cast<int(*)()>(foo)() на bar().

Pete Becker 27.10.2018 16:21

вы ищете функцию с переменным списком аргументов? см. stackoverflow.com/questions/1657883/…

Wolfgang Fahl 27.10.2018 16:22

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

Spencer 27.10.2018 16:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
60
3

Ответы 3

Вы можете явно указать указатель на функцию, но не уверены, что нужно.

#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) (); не могли бы вы объяснить?

Udesh 27.10.2018 16:17

Я добавил еще несколько пояснений

PeterT 27.10.2018 16:22

Нет чистых способов сделать это, есть только уродливые. Такие как:

static_cast<int (*)()>(&foo)();

Или:

int (*p)() = &foo;

(*p)();

Суть в том, что вы не можете полагаться на разрешение перегрузки из-за двусмысленности. Следовательно, вам нужно явно однозначно разрешить символ, используя такой подход.

Предпочтительное решение - в первую очередь избегать неоднозначных перегрузок. Обычно можно найти какой-нибудь разумный способ сделать это, но способ этого зависит от фактических деталей.

  1. Удалите аргумент по умолчанию или
  2. Переименуйте одну из функций

Непонятно, почему в двух объявлениях функций используется одно и то же имя. Вы должны делать это только в том случае, если они должны «делать то же самое».

Удалить аргумент по умолчанию

Если две функции должны делать одно и то же, тогда:

Когда вы указываете аргумент функции по умолчанию, вы получаете дополнительную сигнатуру функции. Таким образом,

int foo(int arg=10);

также дает вам

int foo();

Он говорит, что с * любой звонок " "для foo() значение arg равно 10.

Но затем вы добавили дополнительный int foo();, который возвращает 0, что сбивает компилятор с толку. На более абстрактном уровне вы фактически запутали сам относительно того, что является аргументом по умолчанию для «вещи», которую должна делать ваша функция.

Переименуйте одну из функций

Если две функции не делают одно и то же, у них не должно быть одного и того же имени. Это можно сделать несколькими способами:

  • Придумайте новое имя для одного
  • поместите один из них в пространство имен
  • использовать шаблон

Другие вопросы по теме