Неопределенная ошибка компоновщика ссылок при реализации функции, объявленной в анонимном пространстве имен

#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:: , чтобы ссылаться на имя анонимного пространства имен? У него ее нет.

Итог: невозможно объявить что-либо внутри анонимного пространства имен, а затем определить это в другом месте, поскольку не существует механизма для указания надлежащей области видимости.