Ваша перегрузка члена принимает только неконстантные экземпляры EX
для первого операнда, в то время как свободная перегрузка принимает как константные, так и неконстантные экземпляры. По правилам разрешения перегрузки неконстантный выигрывает, потому что он точно соответствует типу, который передается.
Вы получите ошибку неоднозначности, если сделаете перегрузку члена const, указывая, что *this
является const:
void operator+(const EX& ref) const
{
cout << "A";
}