web-dev-qa-db-fra.com

unqualified-id attendu avant la constante de chaîne

J'écris actuellement une application C++ qui implémente un oscillateur en conjonction avec math.h. Le code que je possède devrait fonctionner correctement pour l'application (en essayant de compiler un fichier objet), mais je reçois une erreur de compilation ayant probablement à voir avec la syntaxe/etc; Je pense que cela a quelque chose à voir avec l'espace de noms. L'erreur:

Sortie du 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

J'ai vu d'autres suggestions qui mentionnent l'utilisation de g ++ -Wall -g mais je ne suis pas sûr que ce soit le problème et qu'il se passe autre chose ici.

Toute aide serait très appréciée! Merci!!

23
DanMoore

C'est un problème simple.

Vous avez juste oublié le point-virgule à la fin de votre fichier d'en-tête.

Les erreurs de compilation que vous obtenez pour avoir raté le point-virgule à la fin d'une définition de classe sont très difficiles à relier au problème réel - prenez simplement l'habitude de vérifier cela lorsque vous obtenez des erreurs après avoir créé une classe.

87

Une autre façon de produire cette erreur: définissez une macro sur une constante de chaîne, puis utilisez le nom de la macro comme nom d'une constante de chaîne. Exemple

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

La réponse évidente est de supprimer l'une des définitions ou d'en changer le nom.

4
bleater

Votre code a plusieurs problèmes:

  • Vous devez qualifier entièrement les noms (void oscillators::print_table() au lieu de simplement void print_table()) dans oscillators.cpp
  • Vous devez probablement #include "oscillators.h" dans oscillators.cpp
  • Vous devez déclarer correctement les variables dans l'implémentation
  • Ajoutez des points-virgules manquants.

Mais je suppose que erreur spécifique est dû au point-virgule manquant après la définition de la classe dans le fichier d'en-tête. Ajoutez-le simplement comme:

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