Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
1

Пространство имен и конфликт имен

04.10.2020, 22:00. Показов 4130. Ответов 32

Author24 — интернет-сервис помощи студентам
Доброго времени суток уважаемые пользователи. В контексте решаемой задачи возникла необходимость написать функцию деления двух чисел, в ней нет абсолютно ничего особенного, да и вопрос, собственно, не к функции. Вот ее код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
 
int div(int x, int y)
{
    return x/y;
}
 
...
Проблема в том что, компилятор жалуется на уже имеющуюся в функцию в файле stdlib.h со схожей сигнатурой, но отличным возвращаемым типом, хотя, как видно выше, файл stdlib.h мною не подключался и из стандартного пространства имен подключены только три функции, но, не смотря на эти ограничения, конфликт имен все еще существует. Почему такое происходит, ведь в данной ситуации не должно быть конфликта имен? Прошу Вас указать в чем моя ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2020, 22:00
Ответы с готовыми решениями:

пространство имен
Здравствуйте! У меня вопрос...В си есть такая функция printf, которая аналогична функции С++...

Пространство имен
Я часто встречаю в книгах, туторах, что объявлять пространство имен в больших проектах нельзя(не...

пространство имён
Здравствуйте. Из C# я примерно представляю что такое пространство имён. Но возникает вопрос....

Пространство имен
Здравствуйте, имеется код : triangle.h #ifndef TRIANGLE_H_INCLUDED #define...

32
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:02 2
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
файл stdlib.h мною не подключался
Кроме тебя, есть еще iostream, который подключает много всего.
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:05  [ТС] 3
iostream подключает много всего если использовать using namespace std, а у меня подключены именно три функции cout, cin и endl и ничего кроме них не должно подключаться
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:11 4
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
iostream подключает много всего если использовать using namespace std, а у меня подключены именно три функции cout, cin и endl и ничего кроме них не должно подключаться
stdlib.h - сишный заголовок. Ему пофиг на твои namespace'ы.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:12  [ТС] 5
И вообще подключение файла не равнозначно подключению пространства имен этого файла
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:14 6
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

Цитата Сообщение от DrFaust1729 Посмотреть сообщение
И вообще подключение файла не равнозначно подключению пространства имен этого файла
Нет никакого пространства имен в сишном заголовке.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:14  [ТС] 7
Вот тут можно подробнее или ссылки на источники
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:17 8
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Вот тут можно подробнее или ссылки на источники
Про что подробнее и на источники о чем? Что конкретно не понятно? Представь, что у тебя функция div просто валяется в хидере. Все. Ты объявляешь такую же - конфликт. Пространства имен тут не участвуют никаким боком.
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:22  [ТС] 9
Благодарю за пояснение, мне было известно об отсутствии пространства имен в C, но полагал, как оказалось ошибочно, что в плюсах каждый файл относятся к конкретному пространству имен, в том числе и сишные
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:27 10
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
что в плюсах каждый файл относятся к конкретному пространству имен, в том числе и сишные
Нет, это две несвязанные сущности. Плюсовый заголовочник потом просто сишную функцию через
C++
1
using ::div;
добавит к себе в пространство std и все. Итого видимый div для глобального пространства и в std.
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.10.2020, 22:32 11
не по теме вопроса:

Цитата Сообщение от DrFaust1729 Посмотреть сообщение
вопрос, собственно, не к функции
как сказать. у Вас целочисленное деление + сама функция типа int. вряд ли это то что Вам нужно
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:46  [ТС] 12
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет, это две несвязанные сущности
То, что это эти сущности не связаны, это спорное утверждение, так как пространство имен необходимо для предотвращения конфликта одинаковых имен в разных файлах

Добавлено через 5 минут
Цитата Сообщение от Yetty Посмотреть сообщение
как сказать. у Вас целочисленное деление + сама функция типа int. вряд ли это то что Вам нужно
Как уже было сказано, вопрос заключался в именно конфликте имен, а не в реализации функции, т.е. в необходимости рассмотреть функцию с сигнатурой схожей с уже имеющейся функцией.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 22:50 13
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
То, что это эти сущности не связаны, это спорное утверждение, так как пространство имен необходимо для предотвращения конфликта одинаковых имен в разных файлах
Для чего оно надо - вопрос философский. И как связано имя std с заголовочным файлом iostream? Разве я не могу поменять имя файла не убрав из него std? Или наоборот, убрать std, оставив заголовочный файл. Так о какой конкретно связи речь?
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 22:56  [ТС] 14
Цитата Сообщение от Vourhey Посмотреть сообщение
И как связано имя std с заголовочным файлом iostream
Заголовочный файл iostream включен в пространство имен std.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 23:03 15
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Заголовочный файл iostream включен в пространство имен std.
Нет
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 23:09  [ТС] 16
Цитата Сообщение от Vourhey Посмотреть сообщение
Так о какой конкретно связи речь?
Речь о том, что при наличии файла входящего в определенное пространство имен, невозможно использовать содержимое этого файла (будь то классы, функции и т.д.) без объявления using или директивы using
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 23:13 17
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Речь о том, что при наличии файла входящего в определенное пространство имен, невозможно использовать содержимое этого файла (будь то классы, функции и т.д.) без объявления using или директивы using
Тоже нет. И сама фраза, когда в пространство имен у тебя входит файл, она странная.
Ну да фиг с ним. Эта мистическая связь в твоей голове и привела тебя к созданию этой темы. Дальше думай, что хочешь
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 23:28  [ТС] 18
К чему же в таком случае используется директива или объявление using?

Добавлено через 4 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет
Библиотека iostream, подключаемая через заголовочный файл iostream, входит в std, если быть точнее
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.10.2020, 23:35 19
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
К чему же в таком случае используется директива или объявление using?
вопрос сформулирован как то странно.
ты не русский что ли?

не к "чему же", а "для чего".

ключевое слово using позволяет объединить имя (или пространство имен) с текущим.

например, в твоём случае:
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
using std::cout;
ты сообщил компилятору, что имя ::std::cout должно быть доступно в глобальном скоупе.

теперь необязательно писать полное (квалифицированное) имя ::std::cout,
можно писать неквалифицированное (без указания полного пути) - cout

для чего такое может быть нужно?
например, просто для удобства разработчика.

вот ты зачем написал свои
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
using std::cout;
чем руководствовался, когда написал эту строчку?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.10.2020, 23:42 20
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
К чему же в таком случае используется директива или объявление using?
Я устал.
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Библиотека iostream
iostream - это просто имя файла. Никуда это файл не входит и ни откуда не выходит. Ни про какие "библиотеки" он тоже не в курсе.
0
04.10.2020, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2020, 23:42
Помогаю со студенческими работами здесь

Пространство имён
Добрый вечер, 1) как правильно называется часть &quot;Foo::&quot; в этой записи void Foo::hello(){} 2) и...

Пространство имен
Зачем пространство имен в программировании я чет не понимаю? У мну в учебнике отак написано....

Пространство имён!
Как лучше указывать пространство имён? using namespace std вначале? или std::? вроде бы проще...

Пространство имён
Прочитал сейчас раздел про пространство имён, но так всё равно и не понял, почему лучше не...

Пространство имен
Подскажите, пожалуйста. Если я создам своё пространство имен и в нем создам функцию, например,...

пространство имен
Один практикующий программист сказал мне, что пространство именusing namespace std; нежелательно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru