Вам нужно сказать следующее (поскольку вы подружитесь с целым шаблоном вместо его специализации, в этом случае вам просто нужно будет добавить <>
после operator<<
):
template<typename T>
friend std::ostream& operator<<(std::ostream& out, const MyClass<T>& classObj);
На самом деле, нет необходимости объявлять его своим другом, если он не имеет доступа к закрытым или защищенным пользователям.Поскольку вы просто получаете предупреждение , похоже, ваше заявление о дружбе не очень хорошая идея.Если вы просто хотите объявить единственную специализацию этого как друга, вы можете сделать это, как показано ниже, с предварительным объявлением шаблона перед вашим классом, так что operator<<
распознается как шаблон.
// before class definition ...
template <class T>
class MyClass;
// note that this "T" is unrelated to the T of MyClass !
template<typename T>
std::ostream& operator<<(std::ostream& out, const MyClass<T>& classObj);
// in class definition ...
friend std::ostream& operator<< <>(std::ostream& out, const MyClass<T>& classObj);
И вышеприведенный, и этот способ объявляют его специализацию друзьями, но первый объявляет все специализации друзьями, а второй объявляет только специализацию operator<<
друг, чей T
равен T
класса, дающего дружбу.
И в другом случае ваша декларация выглядит нормально, но учтите, что вы не можете +=
a MyClass<T>
до MyClass<U>
, когда T
и U
имеют другой тип с этой декларацией (если толькоу вас есть неявное преобразование между этими типами).Вы можете сделать свой +=
шаблон участника
// In MyClass.h
template<typename U>
MyClass<T>& operator+=(const MyClass<U>& classObj);
// In MyClass.cpp
template <class T> template<typename U>
MyClass<T>& MyClass<T>::operator+=(const MyClass<U>& classObj) {
// ...
return *this;
}