expected unqualified-id before string constant

77,333

Solution 1

This is a simple problem.

You just forgot the semi colon at the end of your header file.

The compiler errors you get for missing the semi colon at the end of a class definition are very hard to relate to the actual problem - just get in the habit of checking that when you get errors after you create a class.

Solution 2

Another way to produce this error: define a macro to a string constant, and later, use the macro name as the name of a string constant. Example

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

The obvious answer is to remove one of the definitions, or change the name of one.

Solution 3

Your code has multiple problems:

  • You need to fully qualify names(void oscillators::print_table() instead of just void print_table()) in oscillators.cpp
  • You probably need to #include "oscillators.h" into oscillators.cpp
  • You need to properly declare variables in implementation
  • Add missing semicolons.

But I guess that specific error is caused by missing semicolon after class definition in header file. Just add it like:

    std::vector<double> gtable_; // Will contain a wavetable with a guard point.
};
#endif
Share:
77,333
DanMoore
Author by

DanMoore

Updated on November 27, 2021

Comments

  • DanMoore
    DanMoore over 2 years

    I'm currently writing a C++ application which implements an Oscillator in conjuction with math.h. The code I have should work fine for the application (trying to compile an object file), bu I'm getting a compiler error most likely having to do with syntax/etc; I think it has something to do with namespace. The error:

    Terminal Output:

    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
    

    I've seen other suggestions that mention using g++ -Wall -g but I'm not sure that that is the problem, and that there is something else going on here.

    Any help would be much appreciated! Thanks!!

    • pg1989
      pg1989 almost 12 years
      You include <vector> twice, once in your header and once in your source file.
    • M.M
      M.M over 9 years
      @pg1989 that's fine, standard headers have include guards or equivalent