1

コードをコンパイルするためにg ++を練習していますが、「mallocはこのスコープで宣言されていません」というエラーが最初に表示され続けます。このエラーに関連するコードの一部は次のようになります。

/*------Basic.h--------*/
using namespace std;

/*------A.h------------*/
class A{
 private:
  double* _data;
 public:
 A(int N);
}

/*------A.cpp----------*/
A::A(int N){
  _data=(double*)malloc(N*sizeof(double));
}

Microsoft Virtual Stdio を使用している場合、この問題は発生しません。したがって、行を追加しようとしました

#include <stdlib.h>

Basic.h に変更すると、エラーが消えます。なぜこのようなことが起こるのか、今になって疑問に思っています。「namespace std」には既に stdlib.h が含まれていませんか? どうもありがとう。

4

4 に答える 4

3

名前空間とインクルードファイルは、まったく異なる2つのものです。必要がある

#include <stdlib.h>

または、同等に、

#include <cstdlib>

そのヘッダーファイルの宣言にアクセスするため。

あなたの使用宣言

using namespace std;

一方、名前空間の一部であるstd、つまり内部で宣言された識別子を使用できることを意味します

namespace std {
  /*...*/
}

std::毎回先頭に追加することなく。

たとえば、の場合include <string>はデータ型を使用できますが、追加するstd::string場合は、そのデータ型を単純にとして使用できます。using namespace std;string

ただし、これmallocは名前空間内で定義されていないため、これを使用するには、を含めるだけで済みますstdlib.h

stdlib.hとの違いについては、こちらcstdlibをご覧ください

于 2012-07-11T03:38:35.750 に答える
2

malloc()で定義されて<cstdlib>いるため、ファイルの先頭に含める必要があります。

using namespace std;その特定の名前空間を使用していることをコンパイルに通知するだけで、ライブラリメソッドを含めることとは何の関係もありません。

いずれにせよ、C ++を使用する場合は、動的割り当てnewではなく、実際に使用する必要があります。malloc

于 2012-07-11T03:35:08.450 に答える
1

using namespace std;コンパイラに、私は名前空間を「使用している」とstd伝えます。そのため、ルックアップのために名前空間にいるふりをして、stdstd::毎回言うように言わないでください

問題は、名前空間には(まだ)何もないということです!std

宣言するに#includeは、ヘッダーを作成する必要があります。malloc

そしてそれでも、それはグローバルです-ではありませんstd

于 2012-07-11T03:36:47.450 に答える
0

メモリ割り当てには「new」を使用します。'using namespace std' は stdlib.h とは何の関係もありません。まだ malloc() を使用したい場合は、これを一番上に追加してください。

#include<cstdlib>

幸運を!

于 2012-07-11T03:40:15.670 に答える