我是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,尽管它被宣布为公开?我在那里也放了正确的命名空间。
对任何回复表示感谢。
答案 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;
}
}