0

我有两组文件,一组使用'namespace',另一组使用'using namespace',当我使用后者时,我得到一个未定义的引用错误,如下所示:

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

我不明白为什么会发生错误,因为它只发生在那个功能上?

4

3 回答 3

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
}
于 2013-08-14T17:06:15.997 回答
1

在您的头文件中,该函数位于命名空间内。函数的定义同样必须在命名空间中,以便编译器知道名称查找。using namespace 命令用于从命名空间调用函数以使用简写,即 cout 而不是 std::cout。

于 2013-08-14T16:55:27.807 回答
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
于 2013-08-14T17:03:54.280 回答