If I compile the below into an object file and output it symbol table the operator+ is undefined.
namespace U
{
struct X
{
void foo();
};
X& operator+( U::X& );
struct Y
{
void bar();
};
}
using namespace U;
X& operator+( X& x )
{
return x;
}
void X::foo()
{
}
void Y::bar()
{
X x;
x.foo();
operator+(x);
return;
}
% nm -CA z.o
z.o:
z.o: [Index] Value Size Type Bind Other Shndx Name
z.o: [2] | 0| 0|SECT |LOCL |0 |9 |
z.o: [3] | 0| 0|SECT |LOCL |0 |8 |
z.o: [4] | 0| 0|OBJT |LOCL |0 |6 |Bbss.bss
z.o: [5] | 0| 0|OBJT |LOCL |0 |3 |Ddata.data
z.o: [6] | 0| 0|OBJT |LOCL |0 |5 |Dpicdata.picdata
z.o: [7] | 0| 0|OBJT |LOCL |0 |4 |Drodata.rodata
z.o: [8] | 0| 0|FUNC |GLOB |0 |UNDEF |U::X&U::operator+(U::X&)
[__1cBU2s6Frn0ABX__2_]
z.o: [11] | 16| 36|FUNC |GLOB |0 |2 |U::X&operator+(U::X&)
[__1c2s6FrnBUBX__2_]
z.o: [10] | 72| 24|FUNC |GLOB |0 |2 |void U::X::foo()
[__1cBUBXDfoo6M_v_]
z.o: [9] | 112| 40|FUNC |GLOB |0 |2 |void U::Y::bar()
[__1cBUBYDbar6M_v_]
z.o: [1] | 0| 0|FILE |LOCL |0 |ABS |z.cc
However, if I prefix the operator with the namespace (even though the using namespace is already stated), then it looks ok. Is this a bug?
X& U::operator+( X& x )
{
return x;
}
% nm -CA z.o
z.o:
z.o: [Index] Value Size Type Bind Other Shndx Name
z.o: [2] | 0| 0|SECT |LOCL |0 |9 |
z.o: [3] | 0| 0|SECT |LOCL |0 |8 |
z.o: [4] | 0| 0|OBJT |LOCL |0 |6 |Bbss.bss
z.o: [5] | 0| 0|OBJT |LOCL |0 |3 |Ddata.data
z.o: [6] | 0| 0|OBJT |LOCL |0 |5 |Dpicdata.picdata
z.o: [7] | 0| 0|OBJT |LOCL |0 |4 |Drodata.rodata
z.o: [10] | 16| 36|FUNC |GLOB |0 |2 |U::X&U::operator+(U::X&)
[__1cBU2s6Frn0ABX__2_]
z.o: [9] | 72| 24|FUNC |GLOB |0 |2 |void U::X::foo()
[__1cBUBXDfoo6M_v_]
z.o: [8] | 112| 40|FUNC |GLOB |0 |2 |void U::Y::bar()
[__1cBUBYDbar6M_v_]
z.o: [1] | 0| 0|FILE |LOCL |0 |ABS |z.cc