Я иногда объявляю классы во вложенных пространствах имен, и когда дело доходит до определения их функций-членов, я предпочитаю не указывать каждый из них с этими именами вложенного пространства имен, особенно если они длинные.
Добавление «использования пространства имен» (или, для более точного нацеливания, «использования :: SomeClass») до того, как я определю функции-члены, похоже, избавляет от необходимости уточнять каждое определение, но я не могу найти нигде в спецификации, что гарантирует это, и я беспокоюсь, что это может быть поведение, которое работает только с GCC. Я отмечаю, что, похоже, не существует аналогичного механизма для пропуска необходимости добавлять квалификаторы при определении свободных функций (?).
В качестве примера того, что я имею в виду:
Заголовок:
// example.h
namespace SomeNamespace
{
class SomeClass
{
public:
void someMemberFunction();
};
void someFreeFunction();
};
Реализация:
// example.cpp
#include "example.h"
using namespace SomeNamespace;
void SomeClass::someMemberFunction()
{
// OK: seems to define SomeNamespace::SomeClass::someMemberFunction(),
// even though we didn't qualify it with SomeNamespace::
}
void someFreeFunction()
{
// Not what we wanted; declares and defines ::someFreeFunction(), not
// SomeNamespace::someFreeFunction() (quite understandably)
}
int main()
{
SomeClass a;
a.someMemberFunction(); // Ok; it is defined above.
SomeNamespace::someFreeFunction(); // Undefined!
return 0;
}
Итак, мой вопрос: является ли приведенный выше способ определения SomeClass :: someMemberFunction () допустимым, и где в спецификации это упоминается? Если это законно, целесообразно ли это? Это, конечно, сокращает беспорядок! :)
Большое спасибо:)