Hi, All
Посмотрите на следующий код:
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
friend std::ostream& operator<< (std::ostream& os, const A& a);
friend bool operator < (A&, A&);
private:
int m_i;
};
bool operator < (A& a1, A& a2)
{
return (a1.m_i < a2.m_i);
}
template <class T>
std::ostream& operator<< (std::ostream& os, const A<T>& a)
{
os << a.m_i;
return os;
}
VC++ компилятор выдает ошибку: "error C2248: 'm_i' : cannot access private member declared in class 'A'".
Такое ощущение, что он не понял, что они — друзья. Если же убрать директиву "using namespace std;", то все работает замечательно. Следовательно, это из-за STL. Например, на operator+ компилер выдаст INTERNAL COMPILER ERROR. У меня не было времени покопаться в заголовниках STL, чтобы понять причину таких странных ошибок, но даже если там происходит какая-то колизия имен, то все-равно ошибки должны быть другого сорта (ну например "already declared" или "types mismatch").
Не подскажите причину такого поведения?