Пост из серии "Занимательный стандарт". Листав раздел Using-declaration стандарта по плюсам (тот, что 2003) неожиданно открыл для себя следующую вещь: оказывается одной using-декларацией можно определить в текущем неймспейсе несколько функций с одним именем, но разными параметрами. Но еще тут же можно прибавить ряд функций с таким же именем и перекрывающимися типа аргументов. Ошибкой это вроде как не будет, но вот если вызовите функцию, которая будет конфликтовать с другой (тоже добавленной при помощи using-declaration), то это уже ошибка. Сказанное пояснит пример:
namespace B { void f(int); void f(double); } namespace C { void f(int); void f(double); void f(char); } void h() { using B::f; //B::f(int)и B::f(double) using C::f; //C::f(int), C::f(double) и C::f(char) f(’h’); //вызовется C::f(char) f(1); //ошибка: неоднозначность:
//B::f(int) или C::f(int)? void f(int);//ошибка: //f(int)конфликтует с C::f(int)
//и B::f(int) }
проверил на gcc - сущая правда.
Комментариев нет:
Отправить комментарий