Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class Template and Reference Return Type

Tags:

c++

Long-time reader, first-time poster!

A few comments before I begin: I'm not looking for anyone to do my work for me, I just need a little guidance. Also, I've done a decent amount of googling, and I haven't been able to find any solutions yet.

I have a class assignment that involves creating a template for the following class:

class SimpleStack
{
public:
  SimpleStack();
  SimpleStack& push(int value);
  int pop();

private:
  static const int MAX_SIZE = 100;
  int items[MAX_SIZE];
  int top;
};

SimpleStack::SimpleStack() : top(-1)
{}

SimpleStack& SimpleStack::push(int value)
{
  items[++top] = value;
  return *this;
}

int SimpleStack::pop()
{
  return items[top--];
}

Everything seems to work except SimpleStack& push(int value):

template <class T>
class SimpleStack
{
public:
  SimpleStack();
  SimpleStack& push(T value);
  T pop();

private:
  static const int MAX_SIZE = 100;
  T items[MAX_SIZE];
  int top;
};

template <class T>
SimpleStack<T>::SimpleStack() : top(-1)
{}

template <class T>
SimpleStack& SimpleStack<T>::push(T value)
{
  items[++top] = value;
  return *this;
}

template <class T>
T SimpleStack<T>::pop()
{
  return items[top--];
}

I keep getting the following errors on the definition of SimpleStack& push(int value): "use of class template requires template argument list," and "unable to match function definition to an existing declaration."

Here is main if it helps:

#include <iostream>
#include <iomanip>
#include <string>
#include "SimpleStack.h"
using namespace std;

int main()
{
  const int NUM_STACK_VALUES = 5;
  SimpleStack<int> intStack;
  SimpleStack<string> strStack;
  SimpleStack<char> charStack;

  // Store different data values
  for (int i = 0; i < NUM_STACK_VALUES; ++i)
  {
    intStack.push(i);
    charStack.push((char)(i + 65));
  }
  strStack.push("a").push("b").push("c").push("d").push("e");

  // Display all values
  for (int i = 0; i < NUM_STACK_VALUES; i++)
    cout << setw(3) << intStack.pop();
  cout << endl;

  for (int i = 0; i < NUM_STACK_VALUES; i++)
    cout << setw(3) << charStack.pop();
  cout << endl;

  for (int i = 0; i < NUM_STACK_VALUES; i++)
    cout << setw(3) << strStack.pop();
  cout << endl;

  return 0;
}

Sorry for the excessive code pasting!

like image 262
citizenkoehn Avatar asked Apr 18 '26 01:04

citizenkoehn


1 Answers

Make it

template <class T>
SimpleStack<T>& SimpleStack<T>::push(T value) {...}
like image 106
Igor Tandetnik Avatar answered Apr 19 '26 14:04

Igor Tandetnik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!