Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Хм... Оригинально, но не понятно, должно ли это работать так, как задумано. Как известно, friend declaration не вводит в охватывающий namespace видимого имени. Поэтому не ясно, почему в твоем случае при второй инстанциации 'magic' lookup для дефолтного аргумента вдруг должно найти именно "друга", а не явно объявленную оригинальную версию 'engine'...
Да, friend declaration не вводит в охватывающий namespace видимого имени. Всё правильно. Над этой проблемой пришлось побороться.
На помощь пришёл ADL! Смотри:
class complex
{
...
friend complex operator + (complex, complex);
};
complex c1, c2;
c1 + c2;
Это же работает, хотя тоже вроде как не должно, т.к. operator + () вообще говоря не виден вне класса.
Поэтому я добавил в функцию engine() параметр magic&! Теперь она тоже попадает в рассмотрение!
АТ>На Comeau Online — не работает. А именно, оба 'magic<>::val' одинаковы.
Да, я знаю... это не ко мне, это к ним