web-dev-qa-db-ja.com

エラー:予期されるコンストラクタ、デストラクタ、または ';'の前の型変換トークン?

データファイルを読み取って出力する関数をテストするためにコードをコンパイルしようとしていますが、理解できないコンパイルエラーが発生します。トークン"。関連するコードテキストの壁は以下の通りです。

struct Day
{
  int DayNum;
  int TempMax;
  int TempMin;
  double Precip;
  int TempRange;
};

struct Month
{
  Day Days[31];
  int MonthMaxTemp;
  int MonthMinTemp;
  double TotalPrecip;
  int MonthMaxTempRange;
  int MonthMinTempRange;
  double AverageMaxTemp;
  double AverageMinTemp;
  int RainyDays;
  double AveragePrecip;
}theMonth;

double GetMonth();

double GetMonth()
{
  for (int Today = 1; Today < 31; Today++)
    {
      cout << theMonth.Days[Today].TempMax << theMonth.Days[Today].TempMin;
      cout << theMonth.Days[Today].Precip;
    }
  return 0;
}

GetMonth();  // compile error reported here
17
Owen Pierce

エラーのある行は、GetMonthを呼び出そうとしているように見えますが、グローバルレベルでは、C++プログラムは一連の宣言で構成されています。関数呼び出しは宣言ではないため、グローバルレベルで分離して存在することはできません。定義でもある宣言を持つことができます。その場合、初期化の一部として関数を呼び出すことができます。

ただし、関数呼び出し自体は、他の関数内に含まれている必要があります。

#ifdef TEST
int main() { 
    GetMonth();
}
#endif
24
Jerry Coffin

(他の返信に加えて) 'GetMonth()'関数を実行するには、別の関数( 'main'または 'main'から呼び出されるもの)から呼び出すか、オブジェクトの初期化式で使用する必要があります。名前空間スコープで宣言

double global_dummy = GetMonth();

ただし、後者の方法では初期化順序の問題が発生する可能性があるため、可能な限り前者の方法を使用することをお勧めします。

19
AnT

C/C++では、ヘッダーまたは実装(.c、.cpp、.cxx、etc ...)ファイルの本体に実行可能コードを単純に追加することはできません。代わりに、関数に追加する必要があります。起動時にコードを実行する場合は、必ずmainメソッドに追加してください。

int main(int argc, char *argv[]) {
  GetMonth();
}
6
JaredPar

C++プログラムはグローバルコンテキストでは実行されません。つまり、GetMonthの呼び出しを実行するには、その関数に関数を組み込む必要があります。 int main() { }が適切な場合があります。

3