C ++初学者:使用命名空间错误

时间:2013-04-10 14:42:03

标签: c++

我是C ++的新手,我无法解决下面的编译错误。

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,尽管它被宣布为公开?我在那里也放了正确的命名空间。

对任何回复表示感谢。

4 个答案:

答案 0 :(得分:5)

这是一个链接器错误,因此您可能没有编译所有源文件,或将它们链接在一起,或者使用C编译器(我看到您的文件具有扩展名.c,一些编译器将它们视为C源。

答案 1 :(得分:2)

g++ main.cpp data_structure.cpp -o test应该这样做。

但是我确实需要在您的data_structure.cpp文件中添加#include <iostream>来解析

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’

并使其编译。

答案 2 :(得分: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;
}

答案 3 :(得分: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;
   }
}