Ожидаемый неквалифицированный идентификатор до строковой константы
В настоящее время я пишу приложение на С++, которое реализует осциллятор в сочетании с math.h. Код, который у меня должен, должен хорошо работать для приложения (пытается скомпилировать объектный файл), bu Я получаю ошибку компилятора, скорее всего, связанную с синтаксисом /etc; Я думаю, что это имеет какое-то отношение к пространству имен. Ошибка:
Выход терминала:
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, но я не уверен, что это проблема, и что здесь что-то происходит.
Любая помощь будет очень признательна! Спасибо!!
Ответы
Ответ 1
Это простая проблема.
Вы просто забыли запятую в конце вашего файла заголовка.
Ошибки компилятора, которые вы получаете за отсутствием полуплощадки в конце определения класса, очень сложно связать с реальной проблемой - просто привыкните проверять это, когда вы получаете ошибки после создания класса.
Ответ 2
Другой способ создать эту ошибку: определить макрос в строковой константе, а затем использовать имя макроса в качестве имени строковой константы. Пример
#define FOO "bar"
static const char FOO[] = "bar"; // <-- Error "expected unqualified-id before string constant".
Очевидным ответом является удаление одного из определений или изменение имени.
Ответ 3
В вашем коде несколько проблем:
- Вам необходимо полностью квалифицировать имена (
void oscillators::print_table()
вместо просто void print_table()
) в разделе functions.cpp
- Вероятно, вам нужно
#include "oscillators.h"
включить в генераторы .cpp
- Вам нужно правильно объявить переменные в реализации
- Добавьте отсутствующие точки с запятой.
Но я предполагаю, что определенная ошибка вызвана отсутствием точки с запятой после определения класса в файле заголовка. Просто добавьте его как:
std::vector<double> gtable_; // Will contain a wavetable with a guard point.
};
#endif