A.h
#ifndef _A_H_
#define _A_H_
#include <iostream>
// A.h
using namespace std;
namespace test{
class A{
public:
friend ostream &operator<<(ostream &cout, const A &a);
};
}
#endif
A.cpp
#include "A.h"
using namespace test;
ostream &operator<<(ostream &cout, const A &a){
cout << "a";
return cout;
}
main.cpp
#include <iostream>
#include "A.h"
using namespace test;
int main(){
A a;
cout << a << endl;
return 0;
}
The three files briefly show what I ran into today.
I declared a friend function of class A inside namespace test, and tried to define it like what I wrote in A.cpp. But the linker failed to find the overloaded operator<<.
And finally I found actually test::operator<< is to be called while "using namespace test" won't apply on "operator<<" when you define it.
The correct A.cpp should be like this for both minGW and MSVC Compiler.
#include "A.h"
using namespace test;
namespace test{
ostream &operator<<(ostream &cout, const A &a){
cout << "a";
return cout;
}
}
This will work for MSVC Compiler too.
#include "A.h"
using namespace test;
ostream &test::operator<<(ostream &cout, const A &a){
cout << "a";
return cout;
}
It seems that operators exist with a unique identifier in every namespace. So when I wrote operator<<, it refers to that one of the default namespace instead of the namespace test.