c++ namespaces g++ math.h object-files

c++ - Id. no calificado esperado antes de la constante de cadena



namespaces g++ (3)

Este es un problema simple.

Acaba de olvidar el punto y coma al final de su archivo de encabezado.

Los errores de compilación que se obtienen al perderse el punto y coma al final de la definición de una clase son muy difíciles de relacionar con el problema real; simplemente adquiera el hábito de verificar que cuando se producen errores después de crear una clase.

Actualmente estoy escribiendo una aplicación C ++ que implementa un oscilador en conjunción con math.h. El código que tengo debería funcionar bien para la aplicación (al intentar compilar un archivo de objeto), pero obtengo un error de compilación que probablemente tenga que ver con la sintaxis / etc; Creo que tiene algo que ver con el espacio de nombres. El error:

Salida de terminal:

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; }

Osciladores.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

He visto otras sugerencias que mencionan el uso de g ++ -Wall -g pero no estoy seguro de que ese sea el problema, y ​​de que aquí haya algo más.

Cualquier ayuda sería muy apreciada! ¡¡Gracias!!


Otra forma de producir este error: define una macro para una constante de cadena y, más adelante, usa el nombre de la macro como el nombre de una constante de cadena. Ejemplo

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

La respuesta obvia es eliminar una de las definiciones o cambiar el nombre de una.


Su código tiene múltiples problemas:

  • void oscillators::print_table() calificar completamente los nombres ( void oscillators::print_table() lugar de void print_table() ) en oscillators.cpp
  • Probablemente deba #include "oscillators.h" en oscillators.cpp
  • Necesitas declarar correctamente las variables en la implementación
  • Añadir los puntos y coma que faltan.

Pero supongo que ese error específico se debe a la falta de punto y coma después de la definición de la clase en el archivo de encabezado. Solo agrégalo como:

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