web-dev-qa-db-ja.com

文字列定数の前にunqualified-idが必要です

現在、math.hと組み合わせてOscillatorを実装するC++アプリケーションを作成しています。私が持っているコードは、アプリケーションでうまく動作するはずです(オブジェクトファイルをコンパイルしようとしています)。しかし、構文エラーなどに関係している可能性が高いコンパイラエラーが発生しています。名前空間と関係があると思います。エラー:

ターミナル出力:

User-Name-Macbook-Pro:Synth Parts UserName$ make
g++ -o Oscillators.o -c -I. Oscillators.cpp -c
In file included from Oscillators.cpp:2:
/usr/include/math.h:41: error: expected unqualified-id before string constant
In file included from /usr/include/c++/4.2.1/bits/locale_facets.tcc:42,
             from /usr/include/c++/4.2.1/locale:46,
             from /usr/include/c++/4.2.1/bits/ostream.tcc:46,
             from /usr/include/c++/4.2.1/ostream:635,
             from /usr/include/c++/4.2.1/iostream:45,
             from Oscillators.cpp:4:
/usr/include/c++/4.2.1/typeinfo:41: error: expected declaration before end of line
make: *** [Oscillators.o] Error 1

Oscillators.cpp

#include "Oscillators.h"
#include <math.h>
#include <vector>
#include <iostream>

#define TWOPI (6.2831853072)

using namespace std;

oscillator(int srate = 44100, int tabsize = 8192, double freq = 200) // Default to output 200Hz Sine Wave
{
    if(srate <= 0) {
        cout << "Error: sample rate must be positive" << endl;
        return;
    }
    sizeovrsr_ = (double)tabsize / (double)srate
    if(freq < 20 || freq > 20000) {
        cout << "Error: frequency is out of audible range" << endl;
        return;
    }
    curfreq_ = freq;
    curphase_ = 0.0 // Not out of one, out of tabsize
    incr_ = curfreq * sizeovrsr_;
    for(int i = 0; i < tabsize; i++) {
        gtable.Push_back(sin((i*TWOPI)/(double)tabsize));
    }
    gtable.Push_back(gtable[0]);
}

void print_table()
{
    vector<double>::size_type i;
    for(i = 0; i < gtable.size(); i++)
        cout << gtable[i] << "\n";
    cout << endl;
}

Oscillators.h

#ifndef GUARD_OSCILLATORS_H
#define GUARD_OSCILLATORS_H
#include <vector>

class oscillator {
public:
    /*
    void fill_sine(); // Will change the table to a sine wave
    void fill_square(); // Will change the table to a square wave
    void fill_sawtooth(); // Will change the table to a sawtooth wave
    void fill_triangle(); // Will change the table to a triangle wave
    double tick(double freq); // Will output the current sample and update the phase
    */
    void print_table(); // Will print all table values to standard output
    oscillator(int srate = 44100, double freq = 200, int tabsize = 8192);
private:
    double sizeovrsr_; // Will be set at initialization and will determine phase increase for tick func
    double curphase_;
    double curfreq_; // if the freq sent to a tick function doesn't match the current tick, it will be reset;
    double incr_;
    std::vector<double> gtable_; // Will contain a wavetable with a guard point.
}
#endif

私はg ++ -Wall -gの使用に言及する他の提案を見てきましたが、それが問題であること、そしてここで他に何かが起こっていることはわかりません。

どんな助けも大歓迎です!ありがとう!!

23
DanMoore

これは単純な問題です。

ヘッダーファイルの最後にセミコロンを忘れただけです。

クラス定義の最後にセミコロンがないために発生するコンパイラエラーは、実際の問題に関連付けるのが非常に困難です。クラスを作成した後にエラーが発生した場合、チェックする習慣を身に付けてください。

このエラーを生成する別の方法:文字列定数にマクロを定義し、後で、マクロ名を文字列定数の名前として使用します。例

#define FOO "bar"
static const char FOO[] = "bar"; // <-- Error "expected unqualified-id before string constant".

明らかな答えは、定義の1つを削除するか、定義の名前を変更することです。

4
bleater

コードには複数の問題があります:

  • Oscillators.cppで名前を完全修飾する必要があります(void oscillators::print_table()ではなくvoid print_table())。
  • おそらく#include "oscillators.h" into scillators.cpp
  • 実装で変数を適切に宣言する必要があります
  • 欠落しているセミコロンを追加します。

しかし、特定のエラーは、ヘッダーファイルのクラス定義の後にセミコロンが欠落していることが原因だと思います。次のように追加します。

    std::vector<double> gtable_; // Will contain a wavetable with a guard point.
};
#endif
3