2013-07-19 3 views
1
//file.h 

namespace first 
{ 
    namespace second 
    { 
    void foo(); 
    } 
} 

//file.c 
using namespace first::second; 

void foo() 
{ 
... 
} 

//main.c 
using namespace first::second; 
int main() 
{ 
    foo(); 
} 

приведенный выше код не работает, поскольку компилятор не распознал foo(). где моя ошибка?Как использовать вложенное пространство имен в разных файлах?

+0

Какой компилятор у вас есть? (Возможно, вы захотите использовать .h (pp) /. Cpp как расширение для исходных файлов) –

+0

А как включить директивы? –

+1

Вы хотите добавить сообщение об ошибке на свой вопрос? (Пожалуйста, не добавляйте его в качестве комментария!) – greatwolf

ответ

1

попробовать это:

Это ставит реализацию в пространстве имен

//file.c 
namespace first 
{ 
    namespace second 
    { 
    void foo() 
    { 
... 
    } 
    } 
} 

Это говорит главный явно где найти Foo:

//main.c 
int main() 
{ 
    ::first::second::foo(); 
} 
+2

Я внес изменения в файл.c в соответствии с вашим ответом, и он работает! – user1701840

1

я собираюсь предположить, что вы получили ошибка неразрешенной связи при попытке вызвать foo из основного в примере, который вы опубликовали. Есть пара вопросов в игре здесь, начиная с верхней:

  • file.h объявляет foo существующие в пространстве имен first::second.
  • file.c приводит пространство имен first::second в поиск файлов, но он не влияет на определения функций. Таким образом, реализация void foo() {} на самом деле является функцией, определяемой в глобальном масштабе - не в first::second, как вы могли ожидать.
  • main.c приносит пространство имен first::second в свой файл. Компилятор рассмотрит first::second, а также глобальную область ::, когда вы вызываете foo в main. Компилятор выбирает first::second::foo, так как file.h не объявляет глобальный foo().
  • вы получаете ошибку привязки для неразрешенного символа, потому что first::second::foo так и не был реализован.

В дополнение к предложению Джея, другие исправления вы можете сделать это в полной мере квалифицировать определение Foo похоже на функции-члены:

// file.c 
#include "file.h" 

void first::second::foo() 
{ 
    // ... 
} 
+0

ХОРОШО РАЗВИВАЮТСЯ! БЛАГОДАРЯ! – user1701840

Смежные вопросы