Using Namespace ?

Normann

Well-known member
09.08.2007
168
1
#1
Код:
#include <stdio.h>

namespace _overspace
{

_CRTIMP int __cdecl puts(const char* szSrc)
{
return ::puts(szSrc);
};

} //_overspace

int main(int argc, char *argv[])
{
using namespace _overspace;
puts("start program..."); //выдаст ошибку под названием error C2668: 'puts' : ambiguous call to overloaded function

system("PAUSE");
return EXIT_SUCCESS;

}
VC60
В книжке написано что using namespace можно использовать вместо namespace:: , из-за чего здесь ошибка?
 

Kmet

Java Team
25.05.2006
1 036
8
#2
В книжке написано что using namespace можно использовать вместо namespace:: , из-за чего здесь ошибка?
не совсем вместо... читайте правильные книги

в данном случае компилятор не может определить какую функцию вызвать, стандартный puts или _overspace::puts
 

Normann

Well-known member
09.08.2007
168
1
#3
в данном случае компилятор не может определить какую функцию вызвать, стандартный puts или _overspace::puts
Я не слепой, сообщеня компилятора читать умею.
если есть using namespace то согласно написаному
из книги сказал(а):
Если в программе требуется определить некоторые идентификаторы, которые, как Вы подозреваете, могут переопределить уже имеющиеся, просто заведите свое собственное, новое пространство имен. Это достигается путем использования ключевого слова namespace
...
Для того, чтобы указать компилятору, что следует использовать имена из конкретного именного пространства, можно воспользоваться операцией разрешения видимости:
NewNameSpace::x = 5;
Однако, если в программе обращения к собственному пространству имен производится довольно часто, то такой синтаксис вызывает определенные неудобства. В качестве альтернативы можно воспользоваться инструкцией using, синтаксис которой имеет две формы:
using namespace имя_пространства_имен;
или
using namespace имя_пространства_имен::идентификатор;
При использовании первой формы компилятору сообщается, что в дальнейшем необходимо использовать идентификаторы из указанного именного пространства вплоть до того момента, пока не встретится следующая инструкция using.
обращение к имени не должно вызывать конфликтов.
Вопрос еще раз, из-за чего здесь ошибка? И еще что я не правильно прочитал?
 

Kmet

Java Team
25.05.2006
1 036
8
#4
обращение к имени не должно вызывать конфликтов.
как видишь, компилятор другого мнения

using namespace имя_пространства_имен;
или
using namespace имя_пространства_имен::идентификатор;
При использовании первой формы компилятору сообщается, что в дальнейшем необходимо использовать идентификаторы из указанного именного пространства вплоть до того момента, пока не встретится следующая инструкция using.
бред,,, читайте правильные книжки,

при использовании using компилятор будет пытаться разрезолвить индентификторы без префикса не только для "общего" нэймспэса, но и для всех нэймспэсов указанных через using для данной области видимости
 

Normann

Well-known member
09.08.2007
168
1
#5
С.В.Глушаков А.В.Коваль С.В.Смирнов "Язык программирования C++" (2001г.)

Тогда дайте ссылку на правиьных авторов.
 
04.09.2006
2 566
3
#7
А че, типа русских авторов нету чтоли? Я не владею английским на столько чтобы просто так вот читать книги на нем.
Русские авторы хороши только для написания книг из раздела "для чайников". Читайте переводы гуру С++

Саттер, Майерс, Александреску, Липпман
 

Normann

Well-known member
09.08.2007
168
1
#8
Ну мало ли кто там че кидает.

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

Русские авторы хороши только для написания книг из раздела "для чайников". Читайте переводы гуру С++
Спасибо. А за державу обидно.