У Clang это прямо здесь. Когда вы делаете
template <typename T>
struct LetMeIn : public T {
friend struct WrapperBuilder<T>;
};
WrapperBuilder<T>
становится другом LetMeIn<T>
. Это означает, что WrapperBuilder<T>
может получить доступ ко всему в LetMeIn<T>
. Поскольку LetMeIn<T>
наследуется от T
, это также означает, что WrapperBuilder<T>
может получить доступ к T
части LetMeIn<T>
, к которой LetMeIn<T>
имеет доступ. Это не значит, что WrapperBuilder<T>
становится другом T
Показать это
template<>
struct WrapperBuilder<A> {
LetMeIn<A>::Impl* foo;
};
Компилируется как в clang, так и в gcc, поскольку WrapperBuilder<A>
может иметь доступ к LetMeIn<A>
членам.