我有两组文件,一组使用'命名空间',另一组使用'使用命名空间',当我使用后者时,我得到一个未定义的引用错误如下:
tsunamidata.cpp:(.text+0x1a0): undefined reference to `NS_TSUNAMI::ReadTsunamiData(IntVector2D, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >)'
collect2: ld returned 1 exit status
这是源文件:
#include "tsunamidata.h"
using namespace std;
using namespace NS_TSUNAMI; //if I replace this with 'namespace NS_TSUNAMI' it works!!
vector< vector<double> > ReadTsunamiGrid(IntVector2D pos) {
ifstream infile;
infile.open("H11_V33Grid_wB_grdcor_inundated.grd");
vector< Vector2D> range;
infile>>range[0].x;
infile>>range[0].y;
infile>>range[1].x;
infile>>range[1].y;
IntVector2D dxdy,size;
infile>>dxdy.i; infile>>dxdy.j;
infile>>size.i; infile>>size.j;
for (int j = size.j-1; j>-1; j--)
for(int i=0; i < size.i; i++)
infile>>tsunami_grid[j][i];
return tsunami_grid;
}
bool Agent_drowned(IntVector2D agnt_pos) {
ReadTsunamiData(agnt_pos, tsunami_grid );
return true;
}
double ReadTsunamiData(IntVector2D pos, vector<vector<double> > tsunami_depth) //Function which causes the error!!
{
return tsunami_depth[pos.j][pos.i];
}
头文件:
#ifndef TSUNAMIDATA_H
#define TSUNAMIDATA_H
#include "../../Basic_headers.h"
namespace NS_TSUNAMI {
vector< vector <double> > tsunami_grid;
bool Agent_drowned(IntVector2D agnt_pos);
vector<vector<double> > ReadTsunamiGrid(IntVector2D pos);
double ReadTsunamiData(IntVector2D pos, vector<vector<double> > tsunami_depth);
}
#endif
我不明白为什么会发生错误,因为它只发生在那个函数上?
答案 0 :(得分:4)
namespace NS_TSUNAMI {
bool Agent_drowned(IntVector2D agnt_pos);
}
这在命名空间内声明了一个函数。
using namespace NS_TSUNAMI;
bool Agent_drowned(IntVector2D agnt_pos) {
// whatever
}
这在全局命名空间中声明并定义了一个不同的函数。 using指令使命名空间中的命名空间中的名称可用,但不会更改声明的含义。
要定义先前在命名空间中声明的函数,请将其放在命名空间中:
namespace NS_TSUNAMI {
bool Agent_drowned(IntVector2D agnt_pos) {
// whatever
}
}
或限定名称:
bool NS_TSUNAMI::Agent_drowned(IntVector2D agnt_pos) {
// whatever
}
答案 1 :(得分:1)
在头文件中,该函数位于命名空间内。函数的定义必须类似地在命名空间中,因此编译器知道namelookup。 using namespace命令用于从命名空间调用函数以使用简写,即cout而不是std :: cout。
答案 2 :(得分:1)
名称不合格的函数定义同时是当前名称空间中同一函数的定义和声明。
namespace A {
void foo(); // declares ::A::foo
}
void A::foo() {} // qualified, definition only, depends on previous
// declaration and provides A::foo
void foo() {} // unqualified, both declaration and definition of ::foo