Второй у вас неправильный синтаксис, согласно моему компилятору.Если вы измените их на:
template<typename T> class FooBar {};
template<typename T> class Bar {
friend class FooBar<T>;
};
template<typename T> class Bar2 {
template<typename T2> friend class FooBar;
};
, тогда он скомпилируется.Разница в том, что в Bar<T>
только FooBar<T>
друг;если у вас Bar<int>
, только FooBar<int>
друг, не FooBar<char>
или любой другой тип, кроме int
.В Bar2<T>
любой тип FooBar
является другом.