user3457698
user3457698

Reputation: 1

Error in C++ : redefinition of class constructor using templates

Anybody know how I can fix these errors? i have been looking at it for a while and just cannot figure out what to do.

Error:

indexList.cpp:18: error: redefinition of `indexList<T>::indexList()'
indexList.cpp:18: error: `indexList<T>::indexList()' previously declared here
indexList.cpp:30: error: redefinition of `bool indexList<T>::append(T)'
indexList.cpp:30: error: `bool indexList<T>::append(T)' previously declared here

cpp file:

//
//
//
//
//
//
#include "indexList.h"
#include <iostream>
using namespace std;

//constuctor
//Descriptions: Initializes numberOfElement to 0
//              Initializes maxSize to 100
//Parameters:   none
//Return:       none
template <class T>
indexList<T>::indexList()
{
  numberOfElements = 0;
  maxSize = 100;
}


//Name: append
//Purpose: Adds element to the end of the list. If array is full, returns false
//Paramters: value - thing to append
//Return: true if append succeeds, false otherwise
template <class T>
bool indexList<T>::append(T value)
{
  if (maxSize > numberOfElements)
    {
      list[numberOfElements] = value;
      numberOfElements ++;
      return true;
    }
  else
    return false;
}

I didn't put all the the cpp file because the rest of the errors are similar to the ones above, and it is quite long

header:

#include <iostream>
using namespace std;


#ifndef INDEXLIST_H
#define INDEXLIST_H

template <class T>
class indexList
{
 public:
 indexList();

 bool append(T value);

 bool insert(int indx, T value);

 bool replace(int indx, T newValue);

 bool retrieve(int indx, T &value) const;

 bool remove(int indx);

 void sort();

 int search(T value) const;

private:
 T list[100];
 int numberOfElements;
 int maxSize;
};


template <class T>
ostream &operator<<(ostream &outStream, const indexList<T> &lst);

#include "indexList.cpp"

#endif

I did put the entire header

Upvotes: 0

Views: 1577

Answers (3)

Tony Delroy
Tony Delroy

Reputation: 106216

What you've done is ok, but you must realise that the .cpp file should not itself be compiled into an object - instead, just include the .h file from your application code:

// main.cc

#include "indexList.h"

int main()
{
    indexList<int> il;
}

c++ -o main main.cc

I'd bet it's because you've tried to do a c++ -c indexList.cpp or c++ indexList.cpp that you get the errors (or perhaps your make tool is trying that automatically for all .cpp files in your source code directories - you could try renaming indexList.cpp to indexList.inl or .inc or whatever - remember to change the name in indexList.h too - to see if that fixes the problem), as in that situation the definitions are seen twice: once as the compile includes indexList.h, and again as it finishes compiling indexList.cpp.

There's no need to include indexList.h from within the .cpp anyway - that makes it look as if the indexList.cpp is designed for separate compilation.

Upvotes: 1

Aesthete
Aesthete

Reputation: 18848

Put any of your templated methods in an indexList.inl file, and include that from your header. Don't include the header from this file.

Put any other methods in your indexList.cpp file. Include the header from this file.

Upvotes: 0

aschepler
aschepler

Reputation: 72431

Each of your two files tries to include the other, which can cause the preprocessor to output some repeated code.

Take the #include "indexList.h" out of the file indexList.cpp.

Also, your build process should not attempt to compile indexList.cpp into an object file.

Another way to arrange things would be to just put all the contents you currently have in indexList.cpp near the end of indexList.h, and there would be no indexList.cpp file at all.

Upvotes: 3

Related Questions