Право определять члены пространства имен за пределами их пространства имен, если их имя имеет префикс имени своего пространства имен, и определение действительно происходит в пространстве имен, которое его охватывает. Это не может произойти в пространстве имен, вложенном в пространство имен членов.
namespace A { void f(); }
void A::f() { } // prefix with "A::"
namespace B { }
void B::f() { } // invalid! not declared in B!
namespace C { void f(); }
namespace D { void C::f() { } } // invalid! D doesn't enclose C
namespace E {
void f();
namespace F {
void E::f() { } // invalid! F is nested inside E!
}
}
Это тот же материал, как для членов класса, где вы можете также определить функции за пределами своего класса, до тех пор, как вы префикс имен с именем класса. Однако, как и для классов, члены пространства имен должны быть сначала объявлены в их соответствующем пространстве имен, прежде чем их можно будет определить вне его.
Какой путь более идиоматичен? – Philipp
@Philipp i определяет встроенные функции непосредственно на месте и другие функции отдельно. Особенно, если есть разделение заголовка/реализации-файла. –
Разве это не тавтология? Функции, определенные в определении класса, всегда являются строчными. Я имел в виду, следует ли определять автономные функции, используя 'A :: f' или' namespace A {f} '. По крайней мере, Boost, похоже, предпочитает последнее. – Philipp