Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
#1

Перегрузка функции - C++

22.03.2013, 16:32. Просмотров 520. Ответов 11
Метки нет (Все метки)

Доброго времени суток

Допустим, есть перегруженная функция
C++
1
2
3
4
5
6
7
8
9
void func(long f, long g, int q){cout<<"1";}
void func(long f, int g, int q){cout<<"2";}
 
int main()
{
    int a=4;
    long r=5;
    func(r,r,r);
}
Чем руководствуется компилятор, когда определяет, какую именно функцию вызвать? В данном случае будет вызываться первая, но, видимо, не потому, что там совпадений больше, ведь если написать (int f, long g, long q), то будет неоднозначность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 16:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка функции (C++):

Перегрузка в виде метода VS Перегрузка в виде функции друг - C++
Привет! Собственно сабж: В каких случаях используется перегрузка в виде метода, а когда в виде функции друг? Добавлено через 4...

Вычислить функции с использованием их разложения в степенной ряд. Функции и Перегрузка функций - C++
Добрый день. Дана лабораторная работа, (см. ниже 2 скриншота) по заданию нужно вычислить функции с использованием их разложения в степенной...

Дружественные функции. Наследование. Перегрузка функции - C++
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки кода). Первый код это было 1 задание, 2-ой...

Перегрузка операторной функции и функции ! - C++
3.16Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника....

Перегрузка функции - C++
Люди-программеры, помогите ,пожалуйста, с решением задачи:wall: Создайте функцию promt() для выдачи подсказки пользователю и ожидания...

Перегрузка функции - C++
class num { private: long a; long b; int c; int d; public: num(); num(long, long);

11
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,126
22.03.2013, 16:46 #2
Чем руководствуется компилятор, когда определяет, какую именно функцию вызвать?
параметрами функций
то будет неоднозначность
Компилятор выбрал самую подходящую функцию и использовал приведение типов.
К long f, long g, int q больше подходит long long long, чем к long f, int g, int q
1
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
22.03.2013, 17:02  [ТС] #3
А как определить, какая функция больше подходит в данном случае? Ведь от количества совпадающих по типу параметров, как я понял, это не слишком зависит
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
22.03.2013, 17:26 #4
Называется Argument Dependent Lookup (ADL), в стандарте четко описано, в каком порядке ищутся подходящие функции.
void(long, long, int) является лучшим совпадением чем void(long, int, int), так как в первом случае понижающее приведение с возможной потерей точности long->int требуется лишь для одного параметра (последнего), а не для двух.
2
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
22.03.2013, 17:43  [ТС] #5
Цитата Сообщение от Герц Посмотреть сообщение
Называется Argument Dependent Lookup (ADL), в стандарте четко описано, в каком порядке ищутся подходящие функции.
void(long, long, int) является лучшим совпадением чем void(long, int, int), так как в первом случае понижающее приведение с возможной потерей точности long->int требуется лишь для одного параметра (последнего), а не для двух.
Но если написать void func(int f, long g, long q), то приведение потребуется также для одного параметра (первого), только в таком случае почему-то уже получается неоднозначность
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.03.2013, 17:50 #6
Последовательностью типов данных. Например, (int, int, int) отличается от (int, float, int) и (int, int, int, int)
Не названиями переменных в функции!!!
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
23.03.2013, 00:49 #7
Завтра-послезавтра залезу в стандарт и попробую объяснить попунктно.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.03.2013, 01:13 #8
о разрешении перегрузки неплохо написано в книге:
Шаблоны С++. Справочник разработчика
Авторы: Дэвид Вандевурд
Николаи М. Джосаттис
Приложение Б. Разрешение перегрузки
http://rsdn.ru/res/book/cpp/Template.xml
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
23.03.2013, 14:02 #9
Первый вариант:
C++
1
2
3
4
void f(long, long, int); // f1
void f(long, int, int); // f2
 
f(long, long, long); // calls f1
Смотрим последовательность преобразований:
arg1: f1 и f2 без разницы, long -> long
arg2: f1 имеет лучшее преобразование, long -> long
arg3: f1 и f2 без разницы, long -> int

При сравнении последовательность преобразований выходит, что f1 однозначно лучше (ни для одного из аргументов преобразование не хуже чем у f2, а для второго аргумента - лучше).

Второй вариант:
C++
1
2
3
4
void f(int, long, long); // f1
void f(long, int, int); // f2
 
f(long, long, long); // ambiguity
arg1: f2 имеет лучшее преобразование
arg2: f1 имеет лучшее преобразование
arg3: f1 имеет лучшее преобразование

В этом случае нельзя однозначно сказать, какое из преобразований лучше.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
23.03.2013, 14:40 #10
Цитата Сообщение от Герц Посмотреть сообщение
Называется Argument Dependent Lookup (ADL)
Герц, ADL это немного (точнее много)) другое. Это когда вместо
C++
1
std::operator << (std::cout, "Hello");
мы можем писать
C++
1
std::cout << "Hello";
т.к. аргумент (std::cout) находится в пространстве имен std, то operator<<() ищется там же. В этом и есть суть Argument Dependent Lookup.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
23.03.2013, 14:41 #11
Список подходящий функций для данного вызова так же может искаться с помощью ADL.
Как происходит выбор конкретной функции - я объяснил выше.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
23.03.2013, 14:47 #12
Ну мне со своим скудным английским все же кажется, что ADL так или иначе связан с namespace'ами (точнее с областью видимости) и в выборе перегруженной ф-ции не учавствует.
Кликните здесь для просмотра всего текста
3.4.2 Argument-dependent name lookup [basic.lookup.argdep]
1 When the postfix-expression in a function call (5.2.2) is an unqualified-id , other namespaces not considered
during the usual unqualified lookup (3.4.1) may be searched, and in those namespaces, namespace-scope
friend function declarations (11.4) not otherwise visible may be found. These modifications to the search
depend on the types of the arguments (and for template template arguments, the namespace of the template
argument). [ Example:
namespace N {
struct S { };
void f(S);
}
void g() {
N::S s;
f(s); // OK: calls N::f
(f)(s); // error: N::f not considered; parentheses
// prevent argument-dependent lookup
}
—end example ]
2 For each argument type T in the function call, there is a set of zero or more associated namespaces and a
set of zero or more associated classes to be considered. The sets of namespaces and classes is determined
entirely by the types of the function arguments (and the namespace of any template template argument).
Typedef names and using-declarations used to specify the types do not contribute to this set. The sets of
namespaces and classes are determined in the following way:
— If T is a fundamental type, its associated sets of namespaces and classes are both empty.
— If T is a class type (including unions), its associated classes are: the class itself; the class of which it is a
member, if any; and its direct and indirect base classes. Its associated namespaces are the namespaces
of which its associated classes are members. Furthermore, if T is a class template specialization,
its associated namespaces and classes also include: the namespaces and classes associated with the
types of the template arguments provided for template type parameters (excluding template template
parameters); the namespaces of which any template template arguments are members; and the classes
of which any member templates used as template template arguments are members. [ Note: non-type
template arguments do not contribute to the set of associated namespaces. —end note ]
— If T is an enumeration type, its associated namespace is the namespace in which it is defined. If it is
class member, its associated class is the member’s class; else it has no associated class.
§ 3.4.2 47
c
ISO/IEC N3126=10-0116
— If T is a pointer to U or an array of U, its associated namespaces and classes are those associated with
U.
— If T is a function type, its associated namespaces and classes are those associated with the function
parameter types and those associated with the return type.
— If T is a pointer to a member function of a class X, its associated namespaces and classes are those
associated with the function parameter types and return type, together with those associated with X.
— If T is a pointer to a data member of class X, its associated namespaces and classes are those associated
with the member type together with those associated with X.
If an associated namespace is an inline namespace (7.3.1), its enclosing namespace is also included in the set.
If an associated namespace directly contains inline namespaces, those inline namespaces are also included in
the set. In addition, if the argument is the name or address of a set of overloaded functions and/or function
templates, its associated classes and namespaces are the union of those associated with each of the members
of the set, i.e., the classes and namespaces associated with its (non-dependent) parameter types and return
type.
3 Let X be the lookup set produced by unqualified lookup (3.4.1) and let Y be the lookup set produced by
argument dependent lookup (defined as follows). If X contains
— a declaration of a class member, or
— a block-scope function declaration that is not a using-declaration, or
— a declaration that is neither a function or a function template
then Y is empty. Otherwise Y is the set of declarations found in the namespaces associated with the
argument types as described below. The set of declarations found by the lookup of the name is the union of
X and Y . [ Note: the namespaces and classes associated with the argument types can include namespaces
and classes already considered by the ordinary unqualified lookup. —end note ] [ Example:
namespace NS {
class T { };
void f(T);
void g(T, int);
}
NS::T parm;
void g(NS::T, float);
int main() {
f(parm); // OK: calls NS::f
extern void g(NS::T, float);
g(parm, 1); // OK: calls g(NS::T, float)
}
—end example ]
4 When considering an associated namespace, the lookup is the same as the lookup performed when the
associated namespace is used as a qualifier (3.4.3.2) except that:
— Any using-directives in the associated namespace are ignored.
— Any namespace-scope friend functions or friend function templates declared in associated classes are
visible within their respective namespaces even if they are not visible during an ordinary lookup (11.4).
— All names except those of (possibly overloaded) functions and function templates are ignored.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2013, 14:47
Привет! Вот еще темы с ответами:

Перегрузка функции в С++ - C++
1. Определить функцию Search(), которая позволяет найти самое длинное слово в предложении. Перегрузить функцию Search() для нахождения...

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

Перегрузка функции - C++
Сделать перегрузку для функции : для всех|x|&lt;1 arctg x=x-x^3/3+x^5/5..... аргументом функции является переменная х,а граница ряда...

Перегрузка функции - C++
Доброго времени суток! Дана задача: Написать функции для поиска минимального и максимального элементов, расположенных выше побочной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
23.03.2013, 14:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru