Archived

This topic is now archived and is closed to further replies.

The C modest god

Help with compiler error...

Recommended Posts

I have the following code: #ifndef PRIORITY_QUEUE__ #define PRIORITY_QUEUE__ #include <queue> template"<"class T, class S">" class PriorityQueue{ public: PriorityQueue(); void enqueue(T element); T dequeue(); void makeheap(); bool isEmpty(); private: priority_queue"<"T, vector"<"T">", S">" PQ; }; #endif I get the following errors: d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2143: syntax error : missing ';' before '<' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2501: 'priority_queue' : missing storage-class or type specifiers d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2059: syntax error : '<' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(18) : error C2238: unexpected token(s) preceding ';' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled PQ.CPP d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2143: syntax error : missing ';' before '<' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2501: 'priority_queue' : missing storage-class or type specifiers d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(16) : error C2059: syntax error : '<' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled d:\datastructure\ex2\ex2\ex2\priorityqueue.h(18) : error C2238: unexpected token(s) preceding ';' d:\datastructure\ex2\ex2\ex2\priorityqueue.h(19) : see reference to class template instantiation 'PriorityQueue' being compiled Error executing cl.exe. ex2.exe - 8 error(s), 0 warning(s) What is wrong? And does the vector class is inside queue header? [edited by - The C modest god on May 25, 2004 3:55:04 AM]

Share this post


Link to post
Share on other sites
The only file that uses this file is:

#ifndef LIBRARY2_H__
#define LIBRARY2_H__

#include <iostream>
#include <string>
#include "PriorityQueue.h"

using namespace std;

/********************************************************************************/
/* The basic Event class
Pure virtual class
*/
class Event {
public:
Event (unsigned int _time = 0) : time(_time) { }

virtual ~Event() { }

// Return true if this event occurs earlier than the argument
virtual bool less(const Event& other) = 0;

// Return pointer to new event; 0 if no such event exists
virtual Event* process() = 0;

// Return a string representation of the event
virtual string toString() = 0;

// Return time of occurence
unsigned getTime() const { return time; }
protected:
const unsigned int time;
};

/* Comparison class for events
(Objects of this class are functors)
*/
struct EventComparison{
bool operator () (Event* first, Event* second){
return(second->less(*first));
}
};


/********************************************************************************/

/* The basic Simulation paradigm
Events are held in a priority queue, sorted according to their time
*/
class Simulation{
public:
// Construct a new simulation ending at end_time
Simulation(unsigned _end_time)
: eventQueue(), time(0), end_time(_end_time) { }

// Schedule an event
void schedule(Event* newEvent) { eventQueue.enqueue(newEvent); }

// Run the simulation
void run(){
eventQueue.makeheap();
while( !eventQueue.isEmpty() && (time < end_time)){
Event* current = eventQueue.dequeue();
time = current->getTime();
Event* next = current->process();
cout << "[Time: " << time << "] " << current->toString() << endl;
if(next) schedule(next);
delete(current);
}
while( !eventQueue.isEmpty() ) delete(eventQueue.dequeue());
}
private:
PriorityQueue<Event*, EventComparison> eventQueue;
unsigned int time;
const unsigned int end_time;
};

#endif

Share this post


Link to post
Share on other sites
You''re not using the std namespace in the header. Try prefixing std:: to the priority_queue and the vector in your PriorityQueue class declaration, so the private portion looks like:

private:
std::priority_queue<T,std::vector<T>,S> PQ;


- Neophyte

Share this post


Link to post
Share on other sites
Sorry to go off topic, but your code looks like this to me:
quote:
Original post by The C modest god
#include &ltiostream>
#include &ltstring>
...
time = current-&gtgetTime();
...
PriorityQueue&ltEvent*, EventComparison> eventQueue;

This is really annoying and really hard to read. You are supposed to put semicolons at the end of &lt;, &gt;, and every other character entity, for that matter. This is so that browsers can tell where the character entity ends instead of guessing (should &sigmaf be rendered as ς or σf?) Even better, just use GameDev''s [source] tag. Much easier on us all.

Share this post


Link to post
Share on other sites
Don''t put using in a header. Explicitly qualify in headers e.g. std::vector. It''s far more friendly; it doesn''t drag everything into the global namespace from the vector header. So if I''m using your header I don''t get problems with, for example, having my own variable called vector which is none of your business but you tromp on because you''ve put using namespace std; in your header.

Do what you want in your source file.

Share this post


Link to post
Share on other sites