Вот если Object { o1 }; напишите, то другое дело.
С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен.
С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен.
#include <algorithm>
#include <vector>
class A {
int data;
public:
friend int f1(A a1, A a2) { return 0; }
friend int f2(A a1, A a2) ;
};
int f2(A a1, A a2) { return 0; }
int main(void) {
A a1;
A a2;
std::vector<A> v;
v.push_back(a1);
v.push_back(a2);
f1(a1,a2);
//! std::sort(v.begin(), v.end(), f1 );
std::sort(v.begin(), v.end(), f2 );
return 0;
}
Я не знаю, как это внятно объяснить, вот просто не работает и все. С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен. Просто не надо определять функции-друзей в классе. Э
class Dog {
string nm;
public:
Dog(const string& name) : nm(name) {
cout << "Creating Dog: " << *this << endl;
}
// Synthesized copy-constructor & operator=
// are correct.
// Create a Dog from a Dog pointer:
Dog(const Dog* dp, const string& msg)
: nm(dp->nm + msg) {
cout << "Copied dog " << *this << " from "
<< *dp << endl;
}
~Dog() {
cout << "Deleting Dog: " << *this << endl;
}
void rename(const string& newName) {
nm = newName;
cout << "Dog renamed to: " << *this << endl;
}
friend ostream&
operator<<(ostream& os, const Dog& d) {
return os << "[" << d.nm << "]";
}
};
class M {
public:
int a[8];
};
void func(M data) {
data.a[0] = 0;
data.a[1] = 1;
data.a[2] = 2;
data.a[3] = 3;
}
int main(void) {
M m;
func(m);
}
func(M):
pushl %ebp
movl %esp, %ebp
movl $0, 8(%ebp)
movl $1, 12(%ebp)
movl $2, 16(%ebp)
movl $3, 20(%ebp)
nop
popl %ebp
ret
M::M(M const&) [base object constructor]:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %edx
movl (%edx), %ecx
movl %ecx, (%eax)
movl 4(%edx), %ecx
movl %ecx, 4(%eax)
movl 8(%edx), %ecx
movl %ecx, 8(%eax)
movl 12(%edx), %ecx
movl %ecx, 12(%eax)
movl 16(%edx), %ecx
movl %ecx, 16(%eax)
movl 20(%edx), %ecx
movl %ecx, 20(%eax)
movl 24(%edx), %ecx
movl %ecx, 24(%eax)
movl 28(%edx), %edx
movl %edx, 28(%eax)
nop
popl %ebp
ret
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $68, %esp
subl $8, %esp
leal -72(%ebp), %eax
pushl %eax
leal -40(%ebp), %eax
pushl %eax
call M::M(M const&) [complete object constructor]
addl $16, %esp
pushl -12(%ebp)
pushl -16(%ebp)
pushl -20(%ebp)
pushl -24(%ebp)
pushl -28(%ebp)
pushl -32(%ebp)
pushl -36(%ebp)
pushl -40(%ebp)
call func(M)
addl $32, %esp
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret