В первом случае вы сделали все задом наперед. Когда вы указываете тип возвращаемого значения, вы должны включить список параметров шаблона в идентификатор шаблона (Container<T>
), но когда вы указываете тип параметра, вам не нужно это делать (достаточно только Container
)
template <typename T>
const Container<T> & Container<T>::operator=(const Container & rightCont){
...
Вы по какой-то причине сделали это наоборот.
Во втором случае, когда вы объявляете operator ==
своим другом, он просто предупреждает вас, что в данном случае operator ==
, на который вы ссылаетесь, является обычной функцией. Это не может быть специализация шаблона. То есть для класса Container<int>
функция
bool operator==(const Container<int> &rhs, const Container<int> &lhs) {
// ...
}
будет другом. Но специализация шаблона функции
template <class U>
bool operator==(const Container<U> &rhs, const Container<U> &lhs) {
// ...
}
для U == int
будет не другом Container<int>
. Если это ваше намерение, вы в порядке.
Если вы хотите подружиться с специфической специализацией вышеприведенного шаблона, вам нужно будет сказать
template <typename T>
class Container {
friend bool operator==<T>(const Container<T> &rhs, const Container<T> &lhs);
...
Если вы хотите подружиться со всеми специализациями вышеуказанного шаблона, вам нужно будет сказать
template <typename T>
class Container {
template <class U>
friend bool operator==(const Container<U> &rhs, const Container<U> &lhs);
...