Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
5 / 5 / 0
Регистрация: 15.09.2010
Сообщений: 25

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

25.06.2011, 17:31. Показов 1338. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, сделал класс разбитый на два файла (.h и .cpp). Часть методов этого класса определена прямо в его теле при его объявлении (т.е. в h-файле). Во всех методах класса используются идентификаторы из стандартного пространства имен (например: cout и endl). В cpp-файле указано using namespace std. Все компилировалось нормально до того момента, как я решил добавить в класс виртуальный метод, который также использует эти идентификаторы. Этот метод я определил в объявлении класса в h-файле. После добавления этого метода посыпались сообщения об ошибке "незадекларированный идентификатор" с указанием на эти идентификаторы в виртуальном методе. Почему так происходит? Использование этих же идентификаторов в обычных (не виртуальных) методах этого класса также определенных в объявлении класса не вызывает у компилятора возражений. Приходится либо в определении виртуальной функции писать эти идентификаторы через префикс std::, либо переносить объявление класса в cpp-файл (сразу после using namespace std); в обоих случаях странные ошибки пропадают. Почему так происходит? Это баг компилятора, или я чего-то не знаю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.06.2011, 17:31
Ответы с готовыми решениями:

Segfault на ровном месте
Доброго времени суток. Пишу достаточно простую программку под Linux. Вот кусок кода в котором вылазит ошибка сегментации: void...

Не создаётся объект string на ровном месте! Почему?
Ребята, чё-то я не пойму: #include <string> #include <stdio.h> #include <iostream> using namespace std; int main () { char...

Деление чисел. Ошибка на ровном месте. Не пойму почему.
Пишу задачу, где нужно вычислить простое выражение. И возникает проблема при делении 1 на другие числа. Код ниже: //вычисление формулы ...

7
58 / 50 / 16
Регистрация: 23.06.2011
Сообщений: 122
25.06.2011, 18:30
попробуй в хэд-файле прописать
C++
1
using namespace std;
подключенное пространство имен в одном файле не распространяет свою видимость в других файлах программы...вроде бы...
1
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 18:36
запросто распространяет если объявить в глобальной области видимости хидера
1
58 / 50 / 16
Регистрация: 23.06.2011
Сообщений: 122
25.06.2011, 18:53
но если объявление в cpp то в h виден не будет...или я ошибаюсь..?
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
25.06.2011, 19:08
не ошибаешься, ты ведь .cpp не включаешь никуда
0
5 / 5 / 0
Регистрация: 15.09.2010
Сообщений: 25
25.06.2011, 19:32  [ТС]
Цитата Сообщение от JeyKip Посмотреть сообщение
попробуй в хэд-файле прописать
C++
1
using namespace std;
Да, после этого ошибки пропадают.

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

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

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

Oleg_SK, по какому критерию вы выбираете место реализации функций? Для этого, по всем правилам и нужен .cpp файл. Как исключение можно предложить в .h файле реализовывать только утилиты класса и чисто виртуальные функции. Как было описано выше - с этими функциями проблем нет. Все остальные функции (даже inline) ИМХО должны реализовываться в .cpp файле. Это и упрощает сопровождение и улучшает структуру программы...
1
Заблокирован
25.06.2011, 21:54
1.
В хедере только декларации. В спп - определения.
Если вы в хедере половину только объявите, а другую половину - ещё и определите.
А в спп определите только то, что не было определено в хедере, то при попытке использовать такой модуль в многофайловом проекте, компилятор ЗАСТАВИТ вас убрать все определения из хедера и перенести их в спп.

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

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

Присутствие подобной записи в хэдере - мина замедленного действия.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2011, 21:54
Помогаю со студенческими работами здесь

считываю текстовый файл в строку, программа вылетает на ровном месте, почему?
Друзья! Вот код #include <windows.h> #include <vector> #include <iostream> #include <fstream> #include <stdio.h> #include...

"error: expected unqualified-id at end of input" на ровном месте
Собственно вот код - ничего сложного, пример элементарной вложенной косвенности: #include <iostream> using namespace std; ...

Синтаксические ошибки при компиляции на ровном месте
Добрый день. Пол дня не могу найти ошибку в коде, может вы заметите? MAINWINDOW.H #ifndef MAINWINDOW_H #define MAINWINDOW_H ...

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

Зависание на ровном месте
Привет, уже несколько раз произошла неприятная ситуация. ПК просто берёт и зависает. При этом отключается светодиод в мыши (красный), но...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru