C ++中的错误:使用模板重新定义类构造函数

时间:2014-03-25 01:04:05

标签: c++ list templates

有人知道如何修复这些错误吗? 我已经看了一会儿,只是无法弄清楚该怎么做。

错误:

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文件:

//
//
//
//
//
//
#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;
}

我没有把所有的cpp文件放在一起,因为其余的错误与上面的错误类似,而且很长

头:

#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

我确实放了整个标题

3 个答案:

答案 0 :(得分:3)

你的两个文件中的每一个都试图包含另一个文件,这可能导致预处理器输出一些重复的代码。

从文件#include "indexList.h"中取出indexList.cpp

此外,您的构建过程不应尝试将indexList.cpp编译到目标文件中。

安排事情的另一种方法是将indexList.cpp中当前拥有的所有内容放在indexList.h的末尾附近,并且根本不会有indexList.cpp个文件。< / p>

答案 1 :(得分:1)

你做的很好,但是你必须意识到.cpp文件本身不应该被编译成一个对象 - 而只是包含应用程序代码中的.h文件:

// main.cc

#include "indexList.h"

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

c++ -o main main.cc

我敢打赌,因为你试图做c++ -c indexList.cppc++ indexList.cpp以获得错误(或者你的制作工具可能会自动尝试源代码中的所有.cpp文件代码目录 - 您可以尝试将indexList.cpp重命名为indexList.inl或.inc或其他 - 记得在indexList.h中更改名称 - 以查看是否能解决问题),因为在这种情况下定义会被看到两次:一旦编译包含indexList.h,再次完成编译indexList.cpp。

无论如何都不需要在.cpp中包含indexList.h - 这使得它看起来好像indexList.cpp是为单独编译而设计的。

答案 2 :(得分:0)

将任何模板化方法放在indexList.inl文件中,并在标题中包含该方法。不要包含此文件中的标题。

将任何其他方法放在indexList.cpp文件中。包括此文件中的标题。