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

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

Войти
Регистрация
Восстановить пароль
 
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
#1

Пространства имен и перегрузка функций - C++

28.12.2011, 14:48. Просмотров 562. Ответов 3
Метки нет (Все метки)

описание:
есть библиотека. Пространство имен namespace1, в нем есть несколько перегруженных функций func().
C++
1
2
3
4
5
6
7
8
9
10
11
// header.h
#ifndef header_h
#define header_h
namespace namespace1
{
double func(double a, double b, double c);
double func(int a, double b, int c);
double func(double a, double b);
};
 
#endif
Задача такая:
нужно чтобы вместо определенной перегрузки вызывалась моя перегрузка, при этом моя перегрузка вызывает функцию, которую она хочет заменить.

я сделал следующее, например хотим заменить вторую функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef __HACK_H
#define __HACK_H
 
#include <header.h>
 
namespace hack
{
    double func(int a, double b, int c)
    {
        double result = namespace1::func(a, b, c);
        if (result < 30000)
            result *= 0.8;
 
        return result;
    }
}
 
#endif
затем в исходном header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// header.h
#ifndef header_h
#define header_h
namespace namespace1
{
double func(double a, double b, double c);
double func(int a, double b, int c);
double func(double a, double b);
};
 
#include hack.h
namespace1
{
using hack::func;
};
#endif
я думал, что будет юзаться вторая функция, но ошибка такая:
Код
Error	1	error C2668: 'namespace1::func' : ambiguous call to overloaded function	
main.cpp	37
это при вызове этой функции из пользовательского кода.
не придумал пока как это решить, возможно есть подход отличный от моего, который реализуется без лишнего геморроя

есть какие-нибудь предложения?
можно конечно исправить исходники и заново пересобирать библиотеку, но не хотелось бы этого делать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2011, 14:48     Пространства имен и перегрузка функций
Посмотрите здесь:

Пространства имен в Эклипс C++
C++ Использование пространства имен
C++ Использование пространства имен
C++ Столкнулся с ошибкой пространства имен
Область видимости, пространства имен C++
C++ Перегрузка имен функций
Отличия пространства имен от структуры C++
C++ Как избавиться от явного указания пространства имен
Создание пространства имен C++
Неименованные пространства имен - разобрать код C++
C++ Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
C++ Ошибка C2653: не является именем класса или пространства имен

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17180 / 5434 / 336
Регистрация: 30.03.2009
Сообщений: 14,724
Записей в блоге: 26
28.12.2011, 15:29     Пространства имен и перегрузка функций #2
А как выглядит место использования (точка вызова func). И находится ли оно внутри namespace'а, или снаружи?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
28.12.2011, 15:36  [ТС]     Пространства имен и перегрузка функций #3
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    double a = 2, b = 4, c = 1;
    std::cout << namespace1::func(a, b, c) << std::endl;
    return 0;
}
схематично так, соот-но вне namespace'a
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17180 / 5434 / 336
Регистрация: 30.03.2009
Сообщений: 14,724
Записей в блоге: 26
28.12.2011, 16:24     Пространства имен и перегрузка функций #4
При таком раскладе скорее всего никак. Если сначала написать "using namespace namespace1", а потом использовать просто func, то ещё можно поизголяться с макросами.

Ну или если рассмотреть лишь данный короткий пример (т.е. из namespace1 используются только func и ничего больше), то можно просто воткнуть "#define namespace1 hack" после подключения всех хидеров
Yandex
Объявления
28.12.2011, 16:24     Пространства имен и перегрузка функций
Ответ Создать тему
Опции темы

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