Цель состоит в том, чтобы производный класс s1 имел свой собственный шаблон класса foo< /code>, который полностью скрывает любой foo из s0. А затем, после объявления foo, s1 также хочет указать, что s1::foo является другом s1. Похоже, что gcc интерпретирует первую строку s1 как частичную специализацию s0::foo, но опять же (как ни странно) только если s0 является шаблоном class.
Код: Выделить всё
template< class X >
struct s0
{
template< class T >
struct foo;
};
struct s1 : public s0
{
// - this should be an entirely new class template "foo"
// - hiding the "foo" in s0
// [basic.scope.hiding]
//
template< class T >
struct foo;
// - gcc error is:
// partial specialization 's0::foo' declared 'friend'
// (gcc thinks the line above is a partial specialization??)
//
template< class T >
friend
struct foo;
};
Подробнее здесь: https://stackoverflow.com/questions/791 ... ame-in-der