2013-04-10 3 views
2

Я действительно новичок в C++, и я не могу решить ошибку компиляции ниже.C++ begineer: using namespace error

data_structure.h

#include <stdint.h> 
#include <list> 

namespace A { 

     class B { 
      public: 

      bool  func_init(); // init 
      }; 

}; 

data_structure.cpp

#include "data_structure.h" 

using namespace A; 

bool B::func_init(){ 

    std::cout << "test init" << std::endl; 
    return true; 

} 

main.cpp

#include <iostream> 
#include "data_structure.h" 

using namespace A; 

int main(int argc, char **argv) { 

    A::B s; 
    s.func_init(); 

    return 0; 
} 

У меня есть ошибка в виде следующей

неопределенная ссылка на `A :: B :: func_init()»

Просьба посоветовать, почему я не могу получить func_init, Eventhough он объявлен как общественности? Я также добавил правильное пространство имен.

Буду признателен за любой ответ.

ответ

5

Это ошибка компоновщика, поэтому вы, вероятно, не компилируете все исходные файлы или не связываете их друг с другом или не используете какое-то странное использование компилятора C (я вижу, что ваши файлы имеют расширение .c, некоторые компиляторы рассматривают их как С-источник).

+0

моя ошибка, это был CPP файл из начало, а не файлы c. но у меня все еще есть проблемы с усложнением – xambo

+0

@xambo, как вы компилируете? –

+0

g ++ main.cpp -o test – xambo

0

Вы пробовали не прикладывая

using namespace A; 

в файле data_structure.cpp и вместо того, чтобы положить:

#include "data_structure.h" 

bool A::B::func_init() { 
    std::cout << "test init" << std::endl; 
    return true; 
} 

У меня есть ощущение, что при использовании using namespace A; не позволяет добавлять определения функций в пространство имен, но только сообщает компилятору/компоновщику, где искать типы или функции ...

Другая теория: Вы пытались вставить свой код CPP в том же пространстве имен?

#include "data_structure.h" 

namespace A { 
    bool B::func_init() { 
     std::cout << "test init" << std::endl; 
     return true; 
    } 
} 
2

g++ main.cpp data_structure.cpp -o test должен это сделать.

Однако я должен добавить #include <iostream> в файл data_structure.cpp разрешить

data_structure.cpp: In member function ‘bool A::B::func_init()’: 
data_structure.cpp:7:5: error: ‘cout’ is not a member of ‘std’ 
data_structure.cpp:7:33: error: ‘endl’ is not a member of ‘std’ 

и сделать его компиляции.

1

определение функции должно быть в пространстве имен, которое объявляет эту функцию. Объявление using просто втягивает имена из пространства имен; он не помещает вас внутрь. Таким образом, вы должны написать data_structure.cpp так:

#include "data_structure.h" 
#include <iostream> 

namespace A { 
bool B::func_init() { 
    std::cout << "test init" << std::endl; 
    return true; 
} 
} 

Или, если вы предпочитаете, вы можете использовать имя пространства имен явно в определении функции:

bool A::B::func_init() { 
    std::cout << "test init" << std::endl; 
    return true; 
} 
+0

+1 Это было мое понимание, хотя мне удалось скомпилировать код, эквивалентный OP, используя g ++ 4.4.3, которого я действительно не ожидал работать. – juanchopanza

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