Overloading an STL function

shamgar03

Senior member
Jul 13, 2004
289
0
0
I am trying to alter the pop function of the STL queue so that whenever I pop off the front element it calls delete on the element. I am having trouble though getting my overloading code to compile. I attached my test code. Input would be appreciated
 

shamgar03

Senior member
Jul 13, 2004
289
0
0
Not sure whats up with the attach code thing:
#include <queue>
#include <list>

#include <cstdio>

using namespace std;

void queue<int, list<int> >:: Pop() {
printf("here\n");
c.pop_front();
}

int main()
{
int out;
queue<int, list<int> > myqueue;
myqueue.push(5);
myqueue.push(6);
myqueue.push(7);
out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);

out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);

out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);
}

The error I get is:
test_queue.cpp:8: error: too few template-parameter-lists
 

shamgar03

Senior member
Jul 13, 2004
289
0
0
Ohhh finally got it, you have to have the template <> before the function, and it also has to be put in namespace std, otherwise the compiler will again complain.
#include <queue>
#include <list>

#include <cstdio>

using namespace std;

namespace std {
template<>
void queue<int, list<int> >:: Pop() {
printf("here\n");
c.pop_front();
}
}

int main()
{
int out;
queue<int, list<int> > myqueue;
myqueue.push(5);
myqueue.push(6);
myqueue.push(7);
out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);

out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);

out = myqueue.front();
printf("%i\n", out);
myqueue.pop();
printf("%i\n", out);
}
 

Venix

Golden Member
Aug 22, 2002
1,084
3
81
If you want the queue to manage its own memory, you should just use boost:: ptr_deque or a similar container to back the queue.

Abusing template specialization to change the behavior of a standard library class is just a really bad idea.
 

Templeton

Senior member
Oct 9, 1999
467
0
0
Originally posted by: Venix
If you want the queue to manage its own memory, you should just use boost:: ptr_deque or a similar container to back the queue.

Abusing template specialization to change the behavior of a standard library class is just a really bad idea.

Especially considering that it's illegal to add anything to the std namespace. Either use a boost ptr_container, or roll your own by layering on top of a standard container.