Сообщение Re[5]: Перегрузка operator& от 09.02.2019 13:09
Изменено 09.02.2019 14:49 rg45
Re[5]: Перегрузка operator&
Здравствуйте, Videoman, Вы писали:
V>Действительно работает, спасибо большое . Тогда, для общего развития, можно пояснить два вопроса:
V>1. Чем эта декларация отличается от using namespace impl ?
Это в стандарте есть, назвается argument dependent name lookup (ADL), кажется. Там перечислятеся в каких пространствах имен ищутся кандитаы на подстановку. В данном случае ADL сначала заглядывает в пространство имен, в котором определено перечисление En. Там искомый оператор не находится. Тогда поиск начинается от того пространства имен, в котором содержится обращение к оператору и выше, к обрамляющим пространствам имен, а также в пространсвах имен, которые включены при помощи using-directives. Это восхожение прекращается, как только искомое имя (operator&) находится и начинается анализ всех доступных в этом пространстве кандидатов на подстановку. В данном случае ADL натыкается на operator& для воплощений шаблонного класса A и в пространство impl уже не идет. В случае же использования using-declaration&, operator& из пространства имен impl оказывается внесенным в пространство имен my и находится как самый подходяший кандидат на подстановку.
V>2. using impl::operator&; — "втягивает" объявление осех операторов& ?
Да.
P.S. Простейшая иллюстрация сказанного:
https://ideone.com/o7bb32
Расскомментирование using-declaration устраняет ошибку.
V>Действительно работает, спасибо большое . Тогда, для общего развития, можно пояснить два вопроса:
V>1. Чем эта декларация отличается от using namespace impl ?
Это в стандарте есть, назвается argument dependent name lookup (ADL), кажется. Там перечислятеся в каких пространствах имен ищутся кандитаы на подстановку. В данном случае ADL сначала заглядывает в пространство имен, в котором определено перечисление En. Там искомый оператор не находится. Тогда поиск начинается от того пространства имен, в котором содержится обращение к оператору и выше, к обрамляющим пространствам имен, а также в пространсвах имен, которые включены при помощи using-directives. Это восхожение прекращается, как только искомое имя (operator&) находится и начинается анализ всех доступных в этом пространстве кандидатов на подстановку. В данном случае ADL натыкается на operator& для воплощений шаблонного класса A и в пространство impl уже не идет. В случае же использования using-declaration&, operator& из пространства имен impl оказывается внесенным в пространство имен my и находится как самый подходяший кандидат на подстановку.
V>2. using impl::operator&; — "втягивает" объявление осех операторов& ?
Да.
P.S. Простейшая иллюстрация сказанного:
https://ideone.com/o7bb32
namespace ns1
{
void foo(int){}
namespace ns2
{
void foo(){}
void test()
{
//using ns1::foo;
foo(42); // error: too many arguments to function ‘void ns1::ns2::foo()’
}
} // namespace ns2
} // namespace ns1
Расскомментирование using-declaration устраняет ошибку.
Re[5]: Перегрузка operator&
Здравствуйте, Videoman, Вы писали:
V>Действительно работает, спасибо большое . Тогда, для общего развития, можно пояснить два вопроса:
V>1. Чем эта декларация отличается от using namespace impl ?
Это в стандарте есть, назвается argument dependent name lookup (ADL), кажется. Там перечислятеся в каких пространствах имен ищутся кандитаы на подстановку. В данном случае ADL сначала заглядывает в пространство имен, в котором определено перечисление En. Там искомый оператор не находится. Тогда поиск начинается от того пространства имен, в котором содержится обращение к оператору и выше, к обрамляющим пространствам имен, а также в пространсвах имен, которые включены при помощи using-directives. Это восхожение прекращается, как только искомое имя (operator&) находится. Тогда начинается анализ всех доступных в этом пространстве кандидатов на подстановку. В данном случае ADL натыкается на operator& для воплощений шаблонного класса A и в пространство impl уже не идет. В случае же использования using-declaration&, operator& из пространства имен impl оказывается внесенным в пространство имен my и находится как самый подходяший кандидат на подстановку.
V>2. using impl::operator&; — "втягивает" объявление осех операторов& ?
Да.
P.S. Простейшая иллюстрация сказанного:
https://ideone.com/o7bb32
Расскомментирование using-declaration устраняет ошибку.
V>Действительно работает, спасибо большое . Тогда, для общего развития, можно пояснить два вопроса:
V>1. Чем эта декларация отличается от using namespace impl ?
Это в стандарте есть, назвается argument dependent name lookup (ADL), кажется. Там перечислятеся в каких пространствах имен ищутся кандитаы на подстановку. В данном случае ADL сначала заглядывает в пространство имен, в котором определено перечисление En. Там искомый оператор не находится. Тогда поиск начинается от того пространства имен, в котором содержится обращение к оператору и выше, к обрамляющим пространствам имен, а также в пространсвах имен, которые включены при помощи using-directives. Это восхожение прекращается, как только искомое имя (operator&) находится. Тогда начинается анализ всех доступных в этом пространстве кандидатов на подстановку. В данном случае ADL натыкается на operator& для воплощений шаблонного класса A и в пространство impl уже не идет. В случае же использования using-declaration&, operator& из пространства имен impl оказывается внесенным в пространство имен my и находится как самый подходяший кандидат на подстановку.
V>2. using impl::operator&; — "втягивает" объявление осех операторов& ?
Да.
P.S. Простейшая иллюстрация сказанного:
https://ideone.com/o7bb32
namespace ns1
{
void foo(int){}
namespace ns2
{
void foo(){}
void test()
{
//using ns1::foo;
foo(42); // error: too many arguments to function ‘void ns1::ns2::foo()’
}
} // namespace ns2
} // namespace ns1
Расскомментирование using-declaration устраняет ошибку.