2

現在、ヘッダー ファイルで、配列を使用してコードに std::vectors を実装しようとすると、いくつかの問題が発生しています。

過去 1 時間 30 分にわたって StackOverflow と Google を検索しましたが、役立つ情報が見つかりません。

簡単に言えば、ヘッダー ファイル内で初期化および設定された配列を使用してきました。s を使用してこのコードを変換するstd::vectorと、いくつかの問題が発生しました。

私は (cern) ROOT でプロジェクト分析を行っています。これは、明らかな多くの を使用typedefいます。Int_tint

インポートされたヘッダー ファイルの 1 つが自動的に を呼び出すusing namespace std;ため、すべてのstd::名前空間を省略しました。

現在私は持っています:

// file.h
// ...
const Int_t kNpdgCodes = 14;

Int_t pdgCodeID[kNpdgCodes] = {
        0, // other
       22, // photon
      111, // pi0
     -211, // pim
      211, // pip
      221, // eta
      130, // K0L
      310, // K0s
     -321, // Km
      321, // Kp
    -2112, // (a)n
     2112, // n
     2212, // p
     3122  // Lambda
};
// ...

私はそれをフォームで取得しようとしています(または、便利な = コンストラクターがないため[C ++ 11を使用できません]):

// file.h
// ...
vector<Int_t> pdgCodeID;
pdgCodeID.push_back(    0); // other
pdgCodeID.push_back(   22); // photon
pdgCodeID.push_back(  111); // pi0
pdgCodeID.push_back( -211); // pim
pdgCodeID.push_back(  211); // pip
pdgCodeID.push_back(  221); // eta
pdgCodeID.push_back(  130); // K0L
pdgCodeID.push_back(  310); // K0s
pdgCodeID.push_back( -321); // Km
pdgCodeID.push_back(  321); // Kp
pdgCodeID.push_back(-2112); // (a)n
pdgCodeID.push_back( 2112); // n
pdgCodeID.push_back( 2212); // p
pdgCodeID.push_back( 3122); // Lambda
// ...

これをコンパイルすると (ROOT を使用しますが、重要ではありません)、次のエラーが発生します。

error: expected constructor, destructor, or type conversion before ‘.’ token

に対応する各行push_back

これはヘッダーファイル内でも可能ですか? 何がうまくいかないのですか?

助けていただければ幸いです。

4

4 に答える 4

1

Juanchopanza の言うとおりです。関数の外部で関数 (push_back など) を呼び出すことはできません。次のように変数を初期化する関数を作成する必要があります。

//file.h

vector<Int_t> pdgCodeID;

void InitializeCodeID();

次に、cpp ファイルで関数を定義する必要がありますが、変数を初期化する必要があります。例えば:

//file.cpp

void InitializeCodeID()
{
    pdgCodeID.push_back(    0); // other
    pdgCodeID.push_back(   22); // photon
    pdgCodeID.push_back(  111); // pi0
    // ...
}
于 2013-11-13T15:36:13.060 に答える
0

いいえ、これはグローバルスコープでは不可能です。どこかの関数スコープで行う必要があります。

また、コーディング スタイルに関するいくつかのコメント:

  • これは悪いコーディング スタイルなので、使用しないでusing namespace stdください。本のページに収まるように例を小さくするために、教科書でのみ行われます。代わりに、用途の 1 つに std:: 指定子を使用し、頻繁に使用するものに対してプライベート型を宣言するか、ヘッダーによって宣言された名前空間内で、またはクラス内で のようなより具体的な using 宣言を使用しますusing std::vector

  • ヘッダー ファイルでグローバル変数を定義するべきではありません。ヘッダーが複数のソース ファイルに含まれていると爆発します。代わりに、ヘッダー ファイルでグローバル extern を宣言し、グローバルを定義および初期化するソース ファイルを作成します。

于 2013-11-13T15:34:22.937 に答える