Здравствуйте Аноним, Вы писали:
А>Посмотрите на следующий код:
А>А>#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'".
А>Такое ощущение, что он не понял, что они — друзья.
А почему он должен был это понять? Шаблонная функция 'operator<<' в твоем примере другом класса 'A' не является. Неудивительно, что компилятор ругается не ее попытки доступиться к 'm_i'.
А>Если же убрать директиву "using namespace std;", то все работает замечательно.
"Работать замечательно" это никак не может. Этот код не должен компилироваться ни с 'using namespace std', ни без. Если он у тебя компилируется, то это действительно глюк компилятора.