Итак открываем Страуструпа и читаем раздел 7.4.2:
"Функции объявленные в разных областях видимости (не пространствах имен) не являются перегруженными."
Далее в 8.2.1 написано:
"Пространство имен является областью видимости. Обычные правила областей видимости применимы и к пространствам имен."
Отсюда насколько я понимаю следует что:
inf f() {...}
namespace test { inf f() {...} }
это не перегруженные а переопределенные функции и внутри test будет вызываться внутренняя f. Но в
namespace test1 { int f() {...} }
namespace test2 { int f() {...} }
using namespace test1;
using namespace test2;
функции f перегружены и при их вызове нужно явно разрешать неоднозначность.
Ну вроде логично. Теперь берем POSIX Threads и бубенем следующий код (Да с точки зрения работоспособности бред, но не вней фича):
#include <pthread.h>
namespace test {
int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void*(*start_routine)(void*), void* arg)
{
return ::pthread_create(thread, attr, start_routine, arg);
}
int pthread_mutex_lock(pthread_mutex_t* mutex)
{
return ::pthread_mutex_lock(mutex);
}
void f()
{
pthread_t t;
pthread_mutex_t m;
pthread_create(&t, 0, 0, 0);
pthread_mutex_lock(&m);
}
}
int main(int argc, char* argv[])
{
return 0;
}
Пытаемся откомпилить как g++ test.cc и опа на:
test.cc: In function ‘void test::f()’:
test.cc:23: ошибка: вызов перегруженной функции ‘pthread_mutex_lock(pthread_mutex_t*)’ неоднозначен
test.cc:11: замечание: претенденты: int test::pthread_mutex_lock(pthread_mutex_t*)
/usr/include/pthread.h:734: замечание: int pthread_mutex_lock(pthread_mutex_t*)
Я кроме как ВАУ ничего сказать не могу - один вызов значит однозначен а второй почемуто нет. Не я все могу понять из оперы либо оба перегружены либо оба неоднозначны но такое вот я понять не могу! Может я чего непонимаю???
PS: g++ -###:
Используются внутренние спецификации.
Целевая архитектура: x86_64-suse-linux
Параметры конфигурации: ../configure --prefix=/home/kde-devel/kde --infodir=/home/kde-devel/kde/share/info --mandir=/home/kde-devel/kde/share/man --libdir=/home/kde-devel/kde/lib64 --libexecdir=/home/kde-devel/kde/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/home/kde-devel/kde/include/c++/4.4 --enable-ssp --with-slibdir=/home/kde-devel/kde/lib64 --enable-__cxa_atexit --enable-libstdcxx-allocator=new --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=core2 --build=x86_64-suse-linux
Модель многопоточности: posix
gcc версия 4.4.1 20090423 (prerelease) (GCC)
Похожие темы
- Форум Структура epoll сервера (2010)
- Форум pthread_create() приводит к Segmentation fault (2004)
- Форум pthread.h вопрос (2009)
- Форум pthread_create и прочий бред. (2004)
- Форум pthread (2008)
- Форум Реализовать последовательно-параллельный запуск потоков (2017)
- Форум Posix Threads (2005)
- Форум pthread_create виснет в дочернем процессе. Помогите! (2002)
- Форум Странное поведение thread (2003)
- Форум pthread C++ (2004)