С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

28.12.2011, 14:48. Просмотров 622. Ответов 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
это при вызове этой функции из пользовательского кода.
не придумал пока как это решить, возможно есть подход отличный от моего, который реализуется без лишнего геморроя

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

Перегрузка имен функций - C++
Благодаря чему в С++ разрешена перегрузка имен функций?

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные? - C++
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Создание пространства имен - C++
Всем доброго времени суток !!! Не могу понять назначение создания пространств имен. В книге автор привел следующий код программы....

Пространства имен в Эклипс - C++
Добрый день. Переношу свой проект из IAR на Eclipse+Yagarto(gcc 4.6.2) Подскажите, из-за чего в hpp модулях проекта может не...

Использование пространства имен - C++
Написать программу, использующую описанные типы данных: инициализация переменных (ввод пользователя), выполнение действий (в зависимости от...

Использование пространства имен - C++
Заголовочный файл с осн функциями двунаправленного списка.Нужно построить на его основе стек и очередь с обобщенным интерфейсом т.е...

3
Evg
Эксперт CАвтор FAQ
18383 / 6431 / 441
Регистрация: 30.03.2009
Сообщений: 17,853
Записей в блоге: 28
28.12.2011, 15:29 #2
А как выглядит место использования (точка вызова func). И находится ли оно внутри namespace'а, или снаружи?
0
sandye51
программист С++
685 / 587 / 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
0
Evg
Эксперт CАвтор FAQ
18383 / 6431 / 441
Регистрация: 30.03.2009
Сообщений: 17,853
Записей в блоге: 28
28.12.2011, 16:24 #4
При таком раскладе скорее всего никак. Если сначала написать "using namespace namespace1", а потом использовать просто func, то ещё можно поизголяться с макросами.

Ну или если рассмотреть лишь данный короткий пример (т.е. из namespace1 используются только func и ничего больше), то можно просто воткнуть "#define namespace1 hack" после подключения всех хидеров
1
28.12.2011, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2011, 16:24
Привет! Вот еще темы с ответами:

Область видимости, пространства имен - C++
имею макрос #define max(a,b) (((a) &gt; (b)) ? (a) : (b)) он определен в Windows.h, который мне нужен в проекте... также мне нужна...

Отличия пространства имен от структуры - C++
Есть ли разница между пространством имен и структурой? По-моему почти одно и то же

Столкнулся с ошибкой пространства имен - C++
Столкнулся с такой ошибкой: error C2871: System: пространство имен с таким именем не существует. Стоит четвертый Framework. В нем проблема?

Неименованные пространства имен - разобрать код - C++
Всем доброго дня !!! При изучении темы неименованные пространства имен столкнулся с проблемой. Автор привел такой код. В...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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