#c #namespaces
#c #пространства имен
Вопрос:
При определении сигнатуры функции в анонимном пространстве имен в .hpp, допустимо ли размещать реализацию этой функции в .cpp? Когда я делаю это, я получаю неопределенную ошибку ссылки.
Пример:
//hpp
#ifndef __BAR_HPP_
#define __BAR_HPP_
namespace foo
{
namespace
{
struct Bar
{
void func();
};
}
}
#endif
//cpp
using foo;
void Bar::func()
{
//...
}
Комментарии:
1. Зачем вам использовать подобное анонимное пространство имен? И такие имена, как
__BAR_HPP_
, которые содержат двойное подчеркивание, или имена, начинающиеся с подчеркивания и заглавной буквы, зарезервированы для реализации C .2. Я использовал это так, потому что функция func() относится только к классу Bar.
3. Что ж, сделайте это частной функцией Bar. Или поместите ее в анонимное пространство имен в файле реализации Bar.
4. Как ни странно, у меня это, похоже, работает… хотя мне действительно нужно изменить ‘using foo’ на ‘используя пространство имен foo’…
Ответ №1:
Подумайте об этом:
namespace foo
{
struct Bar
{
void func();
};
}
void Bar::func() { /*impl...*/ }
Ваш код не работает по той же причине, по которой не работает этот код — определение предоставляется в неправильной области видимости. Что необходимо, так это:
void foo::Bar::func() { /*impl...*/ }
Но что вы ставите вместо foo::
, чтобы ссылаться на имя анонимного пространства имен? У него ее нет.
Итог: невозможно объявить что-либо внутри анонимного пространства имен, а затем определить это в другом месте, поскольку не существует механизма для указания надлежащей области видимости.