0

'namespace'を使用するファイルと'using namespace' を使用するファイルの 2 つのセットがあります。後者を使用すると、次のような未定義の参照エラーが発生します。

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

ヘッダー ファイルでは、その関数は名前空間内にあります。コンパイラが namelookup を認識できるように、関数の定義も同様に名前空間にある必要があります。using namespace コマンドは、名前空間から関数を呼び出して短縮形、つまり std::cout の代わりに 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 に答える