Здравствуйте, Juster, Вы писали:
J>Я когда туда заглядываю, мне сразу закрыть хочется. Такое ощущение, что код был создан авто-генератором каким-то, форматирование неудобное, имена жутко запутанные, структура довольно сложная. Кто-то в этом разбирается?
К>namespace aux // откуда мы знали, что это имя задействовано в STL?
К>{
К> struct bar {...};
К> void quick_sort(bar* x, bar* y) // "упорядочим два элемента по-быстрому" - откуда мы знали, что это имя значит что-то иное в std::aux ?
К> {
К> if(x->key > y->key) { quick_swap(x->key, y->key); quick_swap(x->value, y->value); }
К> }
К>}
К>
К>Не буду сейчас лазить в потроха реального STL, просто покажу на примере, где может аукнуться К>
К>namespace std
К>{
К> namespace aux
К> {
К> template<class It> void insertion_sort(It i, It j) { ..... }
К> template<class It> void quick_sort (It i, It j) { ..... }
К> }
К> // интерфейсная функция
К> template<class It>
К> void sort(It i, It j)
К> {
К> if(distance(i,j) < some_treshold)
К> aux::insertion_sort(i,j);
К> else
К> aux::quick_sort(i,j);
К> }
К>}
К>
К>Если кто-то кое-где определил для своих нужд К>чуть выше точки включения #include <algorithm> К>то у нас посыплется сортировка std::vector<aux::bar> в релизной сборке.
Да с чего бы ей сыпаться? Да и от сборки как это может зависить?
namespace aux // откуда мы знали, что это имя задействовано в STL?
{
struct bar {...};
void quick_sort(bar* x, bar* y) // "упорядочим два элемента по-быстрому" - откуда мы знали, что это имя значит что-то иное в std::aux ?
{
if(x->key > y->key) { quick_swap(x->key, y->key); quick_swap(x->value, y->value); }
}
}
namespace std
{
namespace aux
{
template<class It> void quick_sort (It i, It j) { ..... }
}
// интерфейсная функцияtemplate<class It>
void sort(It i, It j)
{
aux::quick_sort(i,j); // это однозначно std::aux::quick_sort, так как aux продикларирована до и находится внутри
}
}
Здравствуйте, B0FEE664, Вы писали:
BFE>Да с чего бы ей сыпаться? Да и от сборки как это может зависить? BFE>А вот если сказать:
Безо всяких using-хаков
#include <cstdio>
namespace aux {
struct foo {};
void quick_sort(foo* f1, foo* f2) { printf("user-defined function\n"); }
}
namespace sss {
namespace aux {
template<class T> void quick_sort(T i, T j) { printf("standard quick sort\n"); }
template<class T> void sort_impl(T i, T j) { quick_sort(i,j); } // мы же, якобы, внутри родного неймспейса, - не квалифицируем имя
}
template<class T> void sort(T i, T j) { aux::sort_impl(i,j); } // здесь имя квалифицированное, компилятор ищет в нужном пространстве
}
int main() {
aux::foo p,q;
sss::sort(&p, &q); // "user-defined function"
}
Здравствуйте, Кодт, Вы писали:
BFE>>Да с чего бы ей сыпаться? Да и от сборки как это может зависить? BFE>>А вот если сказать: К>Безо всяких using-хаков
Переставим sss и aux местами:
#include <cstdio>
namespace sss {
namespace aux {
template<class T> void quick_sort(T i, T j) { printf("standard quick sort\n"); }
template<class T> void sort_impl(T i, T j) { quick_sort(i,j); } // мы же, якобы, внутри родного неймспейса, - не квалифицируем имя
}
template<class T> void sort(T i, T j) { aux::sort_impl(i,j); } // здесь имя квалифицированное, компилятор ищет в нужном пространстве
}
namespace aux {
struct foo {};
void quick_sort(foo* f1, foo* f2) { printf("user-defined function\n"); }
}
int main() {
aux::foo p,q;
sss::sort(&p, &q); // "user-defined function"
}
Ничего не изменилось. Но поведение интересное, согласен.
Здравствуйте, B0FEE664, Вы писали:
BFE>Ничего не изменилось. Но поведение интересное, согласен.
Тут надо уточнить. ADL — дело тонкое... Я точно не помню, какие там правила попадания в поле зрения.
Когда поле зрения ограничено — от начала файла до точки использования, а когда — от начала до конца файла.