user1647959
user1647959

Reputation: 73

Header file class member function declaration error: "incomplete type ' ' name in nested name specifier"

I just split a C++ program that i'm writing up into multiple files.

Now I am getting this error for every member function declaration.

What am I doing wrong?

 3 class Office{
  4     private:
  5         static const int IDLE = 0, BUSY = 1;
  6         const int num_tellers;
  7         int students_served;
  8 
  9         vector<double> que;                                                   // a vector que which holds the arrival times of students entering an Office
 10         vector<int> tellers;                                                 // a vector to hold the status (IDLE or BUSY) of the tellers                *** INITIALIZED TO SIZE tellers[num_tellers] IN CONSTRUCTOR ***
 11 
 12 
 13         variate_generator<mt19937, exponential_distribution<> > serve_time;  // random variable, determines the time it takes a teller to serve a student
 14 
 15     public:
 16 
 17         Office(double const office_mean, int const num_tellers) : num_tellers(num_tellers), tellers(vector<int>(num_tellers, IDLE)),
 18                                                                   serve_time(variate_generator< mt19937, exponential_distribution<> >( mt19937(time(0)), exponential_distribution<>( 1 / office_mean))){
 19         }                                                // initialize tellers vector to size num_tellers w/ tellers[i] = IDLE, accumulated times to , and initializes serve_time random variable




 37 int Office::departure_destination(Event* departure) {     // returns the next destination of a student departing from an Office
 38 
 39     if (departure->depart_from == AID) {
 40         return determine_destination(.15, .15, 0, 0, .70);
 41     else if (departure->depart_from == PARKING)
 42         return next_destination = determine_destination(.3, 0, 0, 0, .7);
 43     else if (departure->depart_from == REGISTRAR)
 44         return next_destination = determine_destination(.25, 0, .1, 0, .65);
 45     else if (departure->depart_from == BURSAR)
 46         return next_destination = determine_destination(0, .1, .2, .1, .60);
 47     else
 48         return -1;
 49 }
 50 

then in the header file

 57 int Office::departure_destination(Event* departure);

Upvotes: 0

Views: 1241

Answers (1)

Tony K.
Tony K.

Reputation: 5605

OK. Follow these rules and you should end up with something pretty close:

  1. Put classes, typedefs, #defines, templates, and inline functions in header files
  2. Wrap your header files with #ifndef/#define/#endif so that accidental multiple inclusions don't cause mult defined symbols
  3. Put your implementation in your c++ files, and include this headers that have (1).

The easiest way to understand this is to realize that nothing in a header file generates actual machine instructions or data. Everything in a header is declarative. It describes how something would generate code or data if it were used, for example, to declare a variable. Your C++ files need these "outlines" in order to understand what you want when you try to call some function in another file, invoke a method on an object, etc.

All of the #define kind of instructions are text processing.

Template are actually a turing-complete language, but they don't generate code until you make something with them...and then it is sorta like they are generating their own C++ files.

Class declarations define what an object would have in it, should you chose to make one.

So, a typical header file (say my_header) will look like this:

#ifndef MY_HEADER
#define MY_HEADER

extern int global;

class A {
   ... data declarations, inline functions ...
   public:
      void f();
};

#endif

and the C++ file:

#include "my_header"

int global; // only in ONE C file...this  generates real data

void A::f() { ... generates real code to be linked to ... }

Upvotes: 3

Related Questions