2012-08-06 166 views
14

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 (tratando de compilar un archivo de objeto), pero estoy obteniendo 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: SalidaID no calificado esperado antes de la constante de cadena

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

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 

que 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 algo más está ocurriendo aquí.

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

+0

Incluye dos veces, una vez en el encabezado y otra en el archivo de origen. – pg1989

+0

@ pg1989 está bien, los encabezados estándar incluyen guardias o equivalentes –

Respuesta

64

Este es un problema simple.

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

Los errores de compilación que obtiene al omitir el punto y coma al final de una definición de clase son muy difíciles de relacionar con el problema real; solo hágase el hábito de verificarlo cuando obtenga errores después de crear una clase.

2

Su código tiene varios problemas:

  • que necesita para calificar plenamente nombres (void oscillators::print_table() en lugar de sólo void print_table()) en oscillators.cpp
  • es probable que tenga a #include "oscillators.h" en oscillators.cpp
  • Es necesario para declarar adecuadamente las variables en la implementación
  • Agregue los puntos y comas faltantes.

pero supongo que error específico es causada por la falta punto y coma después definición de clase en el archivo de cabecera. Sólo tiene que añadir que como:

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

Otra forma de producir este error: definir una macro a una cadena constante, y más tarde, utilice 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.

Cuestiones relacionadas