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

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

Войти
Регистрация
Восстановить пароль
 
Oleg_SK
5 / 5 / 2
Регистрация: 15.09.2010
Сообщений: 25
#1

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

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

В общем, сделал класс разбитый на два файла (.h и .cpp). Часть методов этого класса определена прямо в его теле при его объявлении (т.е. в h-файле). Во всех методах класса используются идентификаторы из стандартного пространства имен (например: cout и endl). В cpp-файле указано using namespace std. Все компилировалось нормально до того момента, как я решил добавить в класс виртуальный метод, который также использует эти идентификаторы. Этот метод я определил в объявлении класса в h-файле. После добавления этого метода посыпались сообщения об ошибке "незадекларированный идентификатор" с указанием на эти идентификаторы в виртуальном методе. Почему так происходит? Использование этих же идентификаторов в обычных (не виртуальных) методах этого класса также определенных в объявлении класса не вызывает у компилятора возражений. Приходится либо в определении виртуальной функции писать эти идентификаторы через префикс std::, либо переносить объявление класса в cpp-файл (сразу после using namespace std); в обоих случаях странные ошибки пропадают. Почему так происходит? Это баг компилятора, или я чего-то не знаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2011, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки на ровном месте (VS2010) (C++):

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

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

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

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

Ошибки при попытке прочитать в указанном месте - C++
#include <iostream> #include <iomanip> #include <locale> using namespace std; struct stack { char c; struct stack...

Доделать и исправить. Дано слово из 12 букв. Поменять местами его трети: первую треть разместить на месте третьей, вторую на месте первой и 3 на 2 - C++
#include<stdio.h> #include<iostream.h> int main(void) { int i,j; char slovo; for(i=0;i<4;i++) { for(j=0;j<3;j++) ...

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

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

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

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

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

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

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

Присутствие подобной записи в хэдере - мина замедленного действия.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 21:54
Привет! Вот еще темы с ответами:

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

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

Заглючила подтаблица на ровном месте - MS Access
Раньше у меня выскакивала подтаблица нормально. Но вот после изменения нескольких изменений наименования столбцов, одна подтаблица...

ошибка казалось бы на ровном месте - PHP
Доброго времени суток в общем, в коем веке решил по разбираться как динамические странички делаются, нашел сайтик, там все красиво и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.06.2011, 21:54
Ответ Создать тему
Опции темы

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