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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2012, 17:26   #1
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию Ошибка при компиляции. P.S. Новичок в С++

код:

Код:
#include <iostream>
using namespace std;

void func1();
void func2();

int count;

int main()
{
    int i;

    for(i=0; i<10; i++) {
        count = i * 2;
        func1();
    }
    return 0;
}

void func1()
{
    cout << "count: " << count;

    cout << '\n';
    func2();
}

void func2()
{
    int count;
    for(count = 0; count<3; count++) cout << '_';
}

ошибки:

||=== Глобальные переменные, Debug ===|
\main.cpp||In function `int main()':|
\main.cpp|14|error: use of `count' is ambiguous|
\main.cpp|7|error: first declared as `int count' here|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\g cc\mingw32\3.4.5\..\..\..\..\includ e\c++\3.4.5\bits\stl_algo.h|413|err or: also declared as `typename std::iterator_traits<_Iterator>:i fference_type std::count(_InputIterator, _InputIterator, const _Tp&)' here|
\main.cpp|14|error: `count' was not declared in this scope|
\main.cpp|14|warning: unused variable 'count'|
\main.cpp||In function `void func1()':|
\main.cpp|22|error: use of `count' is ambiguous|
\main.cpp|7|error: first declared as `int count' here|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\g cc\mingw32\3.4.5\..\..\..\..\includ e\c++\3.4.5\bits\stl_algo.h|413|err or: also declared as `typename std::iterator_traits<_Iterator>:i fference_type std::count(_InputIterator, _InputIterator, const _Tp&)' here|
\main.cpp|22|error: `count' was not declared in this scope|
\main.cpp|22|warning: unused variable 'count'|
||=== Build finished: 8 errors, 2 warnings ===|

Ребят помогите, не могу понять в чем моя здесь ошибка.

Последний раз редактировалось ACE Valery; 27.11.2012 в 18:32.
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 17:38   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

0) Программный код оформляется тегом форума CODE.

Цитата:
Ребят помогите, не могу понять в чем моя здесь ошибка.
Цитата:
\main.cpp|14|error: use of `count' is ambiguous|
\main.cpp|7|error: first declared as `int count' here|
C:\Program Files\CodeBlocks\MinGW\bin\..\lib\g cc\mingw32\3.4.5\..\..\..\..\includ e\c++\3.4.5\bits\stl_algo.h|413|err or: also declared as `typename std::iterator_traits<_Iterator>:: Difference_type std::count(_InputIterator, _InputIterator, const _Tp&)' here|
Перевод: "хозяин, тут это, что-то по имени count в глобальной области видимости с учётом пространств имён уже есть, второй раз чего-нибудь с таким именем объявлять нельзя". Вот что Вы получаете за бездумный using namespace в сочетании с глобальной переменной. Или вычеркните using namespace std и используйте полностью квалифицированное имя для cout, std::cout, либо переименуйте переменную.
Abstraction вне форума Ответить с цитированием
Старый 27.11.2012, 17:45   #3
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
0) Программный код оформляется тегом форума CODE.

Перевод: "хозяин, тут это, что-то по имени count в глобальной области видимости с учётом пространств имён уже есть, второй раз чего-нибудь с таким именем объявлять нельзя". Вот что Вы получаете за бездумный using namespace в сочетании с глобальной переменной. Или вычеркните using namespace std и используйте полностью квалифицированное имя для cout, std::cout, либо переименуйте переменную.
переменную count как глобальную я объявляю один раз, в остальных случая объявляется как локальная.
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 17:49   #4
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
0) Программный код оформляется тегом форума CODE.

Перевод: "хозяин, тут это, что-то по имени count в глобальной области видимости с учётом пространств имён уже есть, второй раз чего-нибудь с таким именем объявлять нельзя". Вот что Вы получаете за бездумный using namespace в сочетании с глобальной переменной. Или вычеркните using namespace std и используйте полностью квалифицированное имя для cout, std::cout, либо переименуйте переменную.
а вот в приложении Microsoft Visual 2008 код скомпилировался без ошибок.
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 17:50   #5
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
0) Программный код оформляется тегом форума CODE.

Перевод: "хозяин, тут это, что-то по имени count в глобальной области видимости с учётом пространств имён уже есть, второй раз чего-нибудь с таким именем объявлять нельзя". Вот что Вы получаете за бездумный using namespace в сочетании с глобальной переменной. Или вычеркните using namespace std и используйте полностью квалифицированное имя для cout, std::cout, либо переименуйте переменную.
в чем тут подвох?
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 18:00   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Нет подвоха, просто компилятор вас предупреждает, что возможен конфликт, ибо не ясно, какую из двух переменных вы имели ввиду.

Почитайте:
http://en.wikipedia.org/wiki/Variable_shadowing
waleri вне форума Ответить с цитированием
Старый 27.11.2012, 18:05   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
в чем тут подвох?
Перечитайте сообщение об ошибке ещё раз. Всё в нём, честно.
Когда Вы написали #include <iostream>, Вы тем самым включили в программу весь текст заголовочного файла библиотеки iostream. В нём, среди прочего, объявлен идентификатор std::count.
Дальше Вы написали using namespace std - эта директива позволяет не писать префикс std:: перед идентификаторами.
Дальше Вы попытались объявить переменную count, и компилятор крепко задумался. Я его хорошо понимаю. Представьте на секунду, что он позволил бы подобное объявление. Тогда в func1, чем следовало бы счесть count - count из Вашего кода, или std::count? Способа различить нет, так что компилятор превентивно, обнаружив "повторное", с его точки зрения, объявление идентификатора count, отрапортовал об ошибке, по мере сил объяснив, что именно ему не нравится.
Увы, слова его не были услышаны...
Abstraction вне форума Ответить с цитированием
Старый 27.11.2012, 18:25   #8
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию

спасибо, примерно понятно, проще переименовать. но вот, что интересно: почему в другом приложении компиляция произошла без ошибок? получается каждое приложение по разному воспринимает суть кода?
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 18:48   #9
danil46
 
Регистрация: 18.04.2010
Сообщений: 8
По умолчанию

а вот что пишет автор книги по этому поводу:
"Несмотря на то что переменная count не объявляется ни в функции main(), ни в функции func1(), обе они могут ее использовать. Но в функции func2() объявляется локальная переменная count. Здесь при обращении к переменной count выполняется доступ к локальной, а не к глобальной переменной. Важно помнить, что, если глобальная и локальная переменные имеют одинаковые имена, все ссылки на "спорное" имя переменной внутри функции, в которой определена локальная переменная, относятся к локальной, а не к глобальной переменной.
danil46 вне форума Ответить с цитированием
Старый 27.11.2012, 23:44   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а вот что пишет автор книги по этому поводу:
Правильно пишет, только Вы нарвались на совершенно другой подводный камень. Это примерно как если бы Вы попытались объявить у себя переменную под названием cin или cout. Только для std::cin и std::cout гарантировано, что они будут доступны <iostream>, а для std::count - нет, поэтому каждый конкретный компилятор в этом вопросе имеет, скажем так, право на вольности.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при компиляции... Тамарочка Общие вопросы C/C++ 3 05.12.2011 00:53
Ошибка при компиляции Banner Помощь студентам 2 20.02.2011 13:09
Ошибка при компиляции vovchok777 Общие вопросы C/C++ 1 26.12.2010 16:07
Ошибка при компиляции 7B! Общие вопросы .NET 7 08.01.2010 13:11
Ошибка при компиляции zak Общие вопросы C/C++ 2 11.12.2007 18:24