У меня есть операторы, объявленные для класса my_type
в пространстве имен my_namespace
.
namespace my_namespace {
class my_type
{
friend std::ostream& operator << (std::ostream& out, my_type t);
}
}
Я пытаюсь определить эти операторы в файле реализации, но когда я пишу что-то подобное
std::ostream& my_namespace::operator << (std::ostream& out, my_type t)
{
out << t;
return out;
}
Я получаю сообщение об ошибке
error: ... operator should have been declared inside 'my_namespace'
Когда я изменяю его на
namespace my_namespace {
std::ostream& operator << (std::ostream& out, my_type t)
{
out << t;
return out;
}
}
тогда он компилируется, но я не понимаю проблемы. Почему это не удалось скомпилировать? С этим все в порядке?
Буду признателен за ссылку на стандарт, поскольку я действительно не знаю, что искать.
1020 * добавлен *
file.h
#ifndef A_H
#define A_H
#include <iosfwd>
namespace N
{
class A
{
friend std::ostream& operator << (std::ostream& out, A& obj);
};
}
#endif
file.cpp
#include "file.h"
#include <iostream>
std::ostream& N::operator << (std::ostream& out, N::A& obj)
{
return out;
}
int main() {}
вот полный пример. Это хорошо работает на VS2010, но дает вышеупомянутую ошибку на gcc 4.4.5.
добавлен
хмм ... да, этот работает
namespace N
{
class A
{
friend std::ostream& operator << (std::ostream& out, A& obj);
};
std::ostream& operator << (std::ostream& out, A& obj);
}
Я всегда думал, что с точки зрения видимости объявление оператора в классе - это то же самое, что объявление вне класса ... похоже, что это не так. Спасибо.
Большое спасибо заранее.