Функции-друзья, даже если они кажутся объявленными внутри класса, являются не функциями-членами, а функциями уровня пространства имен (во вложенном пространстве имен). В своем коде вы правильно объявляете функцию друга, но пытаетесь определить ее как функцию-член класса:
std::ostream& Annuaire::operator<<(std::ostream& os, const Annuaire& obj){
Это определение будет для функции-члена Annuaire
, называемой operator<<
, которая принимает два аргумента, что недопустимо, поскольку operator<<
может быть перегружено одним из двух способов: как свободная функция, принимающая два аргумента ( левая сторона и правая сторона) или как функция-член класса, который появляется в lhs выражения, принимающего аргумент типа rhs. В данном конкретном случае, поскольку lhs равен std::ostream
, и вы не можете его изменить, у вас остается единственная возможность использовать свободную функцию:
std::ostream& operator<<(std::ostream& os, const Annuaire& obj)