Здравствуйте, Alexey F, Вы писали:
AF>Здравствуйте!
AF>В книге Герба Саттера "Новые сложные задачи на C++" (2005 год издания) в восьмой задаче ("Дружественные шаблоны") вычитал, что в g++ проблематично объявить шаблонную функцию (располагающуюся внутри чужого пространства имён) другом класса (по крайней мере, в версии 3.4; в процессе проверки выяснилось, что и используемый мной Mingw 3.4.5 страдает аналогичной проблемой, а вот Mingw 4.3.0 уже воспринимает второй предложенный Саттером вариант решения проблемы "на ура").
AF>...
Visual'ы, начиная с 7.1, также компилируют эти варианты без проблем с единственным исключением — MSVC 7.1 отказывается понимать
friend void Some::func(Test*).
AF>AF>class Test {
AF> ~Test () {}
AF> template<class T>
AF> friend void Some::func ( T* );
AF>};
AF>
AF>Теперь, собственно, вопрос:
AF>"изобретённый" мной способ не противоречит стандарту? Может, эта проблема уже давно решена более красивым способом, не вызывающим нареканий вообще ни у одного компилятора? Если да, можно на него (на способ
) взглянуть?
Такое объявление дружественности абсолютно законно. Но оно имеет несколько отличающийся эффект: дружественными объявляются ВСЕ инстанцированные варианты шаблонной функции
Some::func, тогда как по задумке хотелось бы объявить другом только один конкретный вариант.
AF>P.P.S. Вопрос задан из чистого любопытства и тяги к знаниям, ни в одном проекте конструкцию пока не применял
Самое интересное: что принуждает (или может принудить) нас адаптировать код под старые, далекие от стандарта компиляторы. Конечно, иногда таки приходится. Иногда это даже интересно. Но, если глобально, лучше побыстрее отойти от этих компиляторов, и не тратить зря время.