有人知道如何修复这些错误吗? 我已经看了一会儿,只是无法弄清楚该怎么做。
错误:
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
我确实放了整个标题
答案 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.cpp
或c++ 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
文件中。包括此文件中的标题。