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

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

Восстановить пароль Регистрация
 
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
28.12.2011, 14:48     Пространства имен и перегрузка функций #1
описание:
есть библиотека. Пространство имен 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
28.12.2011, 16:24     Пространства имен и перегрузка функций #4
При таком раскладе скорее всего никак. Если сначала написать "using namespace namespace1", а потом использовать просто func, то ещё можно поизголяться с макросами.

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

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