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

Ошибки на ровном месте (VS2010) - C++

Восстановить пароль Регистрация
 
Oleg_SK
5 / 5 / 2
Регистрация: 15.09.2010
Сообщений: 25
25.06.2011, 17:31     Ошибки на ровном месте (VS2010) #1
В общем, сделал класс разбитый на два файла (.h и .cpp). Часть методов этого класса определена прямо в его теле при его объявлении (т.е. в h-файле). Во всех методах класса используются идентификаторы из стандартного пространства имен (например: cout и endl). В cpp-файле указано using namespace std. Все компилировалось нормально до того момента, как я решил добавить в класс виртуальный метод, который также использует эти идентификаторы. Этот метод я определил в объявлении класса в h-файле. После добавления этого метода посыпались сообщения об ошибке "незадекларированный идентификатор" с указанием на эти идентификаторы в виртуальном методе. Почему так происходит? Использование этих же идентификаторов в обычных (не виртуальных) методах этого класса также определенных в объявлении класса не вызывает у компилятора возражений. Приходится либо в определении виртуальной функции писать эти идентификаторы через префикс std::, либо переносить объявление класса в cpp-файл (сразу после using namespace std); в обоих случаях странные ошибки пропадают. Почему так происходит? Это баг компилятора, или я чего-то не знаю?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
JeyKip
53 / 45 / 2
Регистрация: 23.06.2011
Сообщений: 122
25.06.2011, 18:30     Ошибки на ровном месте (VS2010) #2
попробуй в хэд-файле прописать
C++
1
using namespace std;
подключенное пространство имен в одном файле не распространяет свою видимость в других файлах программы...вроде бы...
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 18:36     Ошибки на ровном месте (VS2010) #3
запросто распространяет если объявить в глобальной области видимости хидера
JeyKip
53 / 45 / 2
Регистрация: 23.06.2011
Сообщений: 122
25.06.2011, 18:53     Ошибки на ровном месте (VS2010) #4
но если объявление в cpp то в h виден не будет...или я ошибаюсь..?
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 19:08     Ошибки на ровном месте (VS2010) #5
не ошибаешься, ты ведь .cpp не включаешь никуда
Oleg_SK
5 / 5 / 2
Регистрация: 15.09.2010
Сообщений: 25
25.06.2011, 19:32  [ТС]     Ошибки на ровном месте (VS2010) #6
Цитата Сообщение от JeyKip Посмотреть сообщение
попробуй в хэд-файле прописать
C++
1
using namespace std;
Да, после этого ошибки пропадают.

Цитата Сообщение от JeyKip Посмотреть сообщение
подключенное пространство имен в одном файле не распространяет свою видимость в других файлах программы...вроде бы...
Как я уже сказал, в обычных методах (не виртуальных) определенных в теле класса (в h-файле) использование этих идентификаторов не вызывает возражений со стороны компилятора, т.е. видимость все-таки распространяется, но почему-то не везде...

Добавлено через 20 минут
Оказалось, что я не верно понял и описал ситуацию, т.к. плохо разобрался в ней. Сорри... На самом деле, в программе есть два класса: простой и шаблонный. Использование указанных идентификаторов в простом классе (в любом методе определенном прямо в теле класса) приводит к ошибке. А вот на использование этих идентификаторов в методах шаблонного класса, определенных прямо в его теле, компилятор не ругается.

З.Ы: Оба класса объявлены в одном заголовочном файле.
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
25.06.2011, 19:36     Ошибки на ровном месте (VS2010) #7
Цитата Сообщение от Oleg_SK Посмотреть сообщение
Сообщение от JeyKip
попробуй в хэд-файле прописать
Код C++
1
using namespace std;
Этим подходом вы разрушаете область глобальных имен. Что не есть гуд в принципе. Так как ваш .h файл может использовать куча .cpp файлов (в грамотно спроектированном проекте это - норма) и в каждом .сpp файле эта область будет открыта. Не для того ИМХО namespace вводился в язык, чтобы его открывать направо и налево.

Oleg_SK, по какому критерию вы выбираете место реализации функций? Для этого, по всем правилам и нужен .cpp файл. Как исключение можно предложить в .h файле реализовывать только утилиты класса и чисто виртуальные функции. Как было описано выше - с этими функциями проблем нет. Все остальные функции (даже inline) ИМХО должны реализовываться в .cpp файле. Это и упрощает сопровождение и улучшает структуру программы...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 21:54     Ошибки на ровном месте (VS2010)
Еще ссылки по теме:

Доделать и исправить. Дано слово из 12 букв. Поменять местами его трети: первую треть разместить на месте третьей, вторую на месте первой и 3 на 2 C++
Ошибки при попытке прочитать в указанном месте C++
C++ у кого VS2010?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
25.06.2011, 21:54     Ошибки на ровном месте (VS2010) #8
1.
В хедере только декларации. В спп - определения.
Если вы в хедере половину только объявите, а другую половину - ещё и определите.
А в спп определите только то, что не было определено в хедере, то при попытке использовать такой модуль в многофайловом проекте, компилятор ЗАСТАВИТ вас убрать все определения из хедера и перенести их в спп.

Привыкайте заранее: в хедере только объявления. Никаких определений.
Исключение составляют шаблоны, которые объявляются и определяются прям в хедере.

2.
using namespace std; //опасная вещь. Писать такую строчку нужно очень аккуратно,
//на максимально короткой дистанции. Где нибудь внутри маленькой функции.

Присутствие подобной записи в хэдере - мина замедленного действия.
Yandex
Объявления
25.06.2011, 21:54     Ошибки на ровном месте (VS2010)
Ответ Создать тему
Опции темы

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