2

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

数据结构.h

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

namespace A {

        class B {
            public:

            bool        func_init(); // init
            };

};

数据结构.cpp

#include "data_structure.h"

using namespace A;

bool B::func_init(){

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

}

主文件

#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

4 回答 4

5

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

于 2013-04-10T14:43:52.677 回答
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’

并使其编译。

于 2013-04-10T14:56:13.673 回答
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;
}
于 2013-04-10T15:08:46.073 回答
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;
   }
}
于 2013-04-10T14:56:00.297 回答