Два способа объявления шаблонных классов друзей? - PullRequest
1 голос
/ 07 августа 2011
template<typename T> class FooBar {};

template<typename T> class Bar {
    friend class FooBar<T>;
};

template<typename T> class Bar2 {
    template friend class FooBar<T>;
};

В чем разница между классом Bar и Bar2?

Ответы [ 2 ]

8 голосов
/ 07 августа 2011

Второй у вас неправильный синтаксис, согласно моему компилятору.Если вы измените их на:

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> или любой другой тип, кроме intBar2<T> любой тип FooBar является другом.

1 голос
/ 07 августа 2011

Если определение класса Bar2 изменено, как показано ниже

template<typename T> class Bar2 {
    template<typename U> friend class FooBar<U>;
};

тогда любой тип FooBar дружит с любым типом Bar2.

Однако определение класса Bar говорит о том, что FooBar с типом T дружит с Bar того же типа. то есть Bar и FooBar , а не Bar & FooBar

Шаша

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...