Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2012, 10:32   #1
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию C++. Две функции в разных файлах мешают друг другу.

Функция average(3, 6) возвращает число типа int, которое является средним арифметическим от двух аргументов типа int, когда она вызывается в одном файле, и возвращает число типа double, которое является средним арифметическим от двух аргументов типа int, когда она вызывается в другом файле в одной и той же программе.


// 1 файл
Код:
static int average(int a, int b)  { return (a+b)/2; }
// 2 файл
Код:
static double average(int a, int b)  { return (a+b)/2.0; }
И вот такая ошибка появляется: error C2556: 'int average(int,int)' : overloaded function differs only by return type from 'double average(int,int)'

Как вообще можно написать эти функции чтобы небыло ошибок? Я пробовал эти функции делать статическими (static), только все равно ничего не получается.
Крот вне форума Ответить с цитированием
Старый 17.03.2012, 10:58   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

http://khpi-iip.mipk.kharkiv.edu/lib...m/cpp/gl4.html

читаем пункт 4.6.7
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 19.03.2012, 13:10   #3
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
static int average(int a, int b)  { return (a+b)/2; }
Код:
static double average(int a, int b)  { return (a+b)/2; }
компилятор видит только эту часть, поэтому и ругается, что функция перегружена.
обзови ее по другому и будет тебе счастье

Код:
static double averagdouble(int a, int b) { return (a+b)/2; }
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 19.03.2012, 19:43   #4
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Вот я цитату приведу из книги Стивен Прата 'Язык программировния С++. Лекции и упражнения'.
"Можно воспользоваться ключевым словом static, чтобы придать функции внутреннее связывание, ограничивая ее использование одним файлом."

Может быть я чего то непонимаю или что-то с компилятором, но у меня ничего не работает.
Тут надо написать две функции с одинаковыми именами. Они отличаются только типом возвращаемого значения.
Крот вне форума Ответить с цитированием
Старый 19.03.2012, 19:49   #5
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

А вы когда нибудь читать то что выдаёт компилятор будете?
Вот вам вопрос
функции должны отличаться сигнатурой функции.
Какими сигнатурами они должны отличаться?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 21.03.2012, 11:01   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Ну тогда так
Код:
template <class Ret>
  Ret average(int a, int b)  { return (a+b)/(Ret)2; }
в коде
Код:
     average<int>(2, 3);
     average<double>(2, 3);
Получаем две одинаковые по названию и разными по возвращаемому значению и типу функции.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 21.03.2012 в 14:54. Причина: добавил приведение делителя к типу возвр. значения
Krok27 вне форума Ответить с цитированием
Старый 21.03.2012, 11:17   #7
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

А если a и b целые числа, тогда в return (a+b)/2; будет отбрасываться дробная часть. Для целых чисел она будет правильно работать а вот для double число будет округляться.
Может быть тут какую-нибудь проверку сделать чтобы знать какой результат должен быть, int или double?

Примерно вот так: Если результат должен быть int, то return (a+b)/2, а если double, то return (a+b)/2.0;

Последний раз редактировалось Крот; 21.03.2012 в 11:24.
Крот вне форума Ответить с цитированием
Старый 21.03.2012, 11:22   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
Может быть тут какую-нибудь проверку сделать чтобы знать какой результат должен быть, int или double?
А какой должен быть?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 21.03.2012, 11:43   #9
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Спасибо Krok27 за помощь. Я тут вот что придумал. Буду пространства имен использовать. Так и полегче и сразу видно какую именно функцию использовать.
Код:
#include "stdafx.h"
#include "iostream"

using namespace std;

namespace functInt
{
	int average(int a, int b)	{ return (a+b)/2; }
}

namespace functDouble
{
	double average(int a, int b)  { return (a+b)/2.0; }
}



int _tmain(int argc, _TCHAR* argv[])
{
	cout << functInt::average(3, 4)		<< endl;  // возвращает int
	cout << functDouble::average(3, 4)	<< endl;  // double



	cin.get();
	return 0;
}
Крот вне форума Ответить с цитированием
Старый 21.03.2012, 11:50   #10
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Ога. Можно и так.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогаем друг другу в поиске музыки mihali4 Свободное общение 56 16.02.2017 22:03
Привязка окон друг к другу при перетаскивании Alexxx5800 Общие вопросы .NET 2 10.10.2010 20:19
Данные по столбцам - упорядочить данные к друг другу PetroD Microsoft Office Excel 10 07.08.2010 12:30
Работа с данными в разных файлах arc Microsoft Office Excel 4 28.04.2010 15:15