我知道有很多这样的问题,但我找不到适合我的解决方案。无论如何,我有4个文件,两个头文件和两个cpp文件,一个实现和一个主。
标题文件1
#ifndef SORTEDINTERFACE_H
#define SORTEDINTERFACE_H
using namespace std;
template<class ListItemType>
class sortedInterface
{
public:
virtual int sortedGetLength() const = 0;
virtual bool sortedIsEmpty() const = 0;
virtual bool sortedInsert(const ListItemType& newItem) = 0;
virtual bool sortedRemove(const ListItemType& anItem) = 0;
virtual bool sortedRetrieve(const ListItemType& anItem) = 0;
virtual int getItemCount () = 0;
private:
virtual int locatePosition(const ListItemType& anItem) = 0;
};
#endif // SORTEDINTERFACE_H_INCLUDED
标头文件2
#ifndef SORTED_H
#define SORTED_H
#include "sortedInterface.h"
using namespace std;
template<class ListItemType>
class sorted : public sortedInterface<ListItemType>
{
public:
sorted();
int sortedGetLength() const;
bool sortedIsEmpty() const;
bool sortedInsert(const ListItemType& newItem);
bool sortedRemove(const ListItemType& anItem);
bool sortedRetrieve(const ListItemType& anItem);
int getItemCount();
private:
static const int DEFAULT_LIST_SIZE = 10;
ListItemType items[DEFAULT_LIST_SIZE];
int itemCount;
int maxItems;
int locatePosition(const ListItemType& anItem);
};
#include "sorted.cpp"
#endif // SORTED_H
CPP档案
#include "sorted.h"
#include <cstddef>
using namespace std;
template<class ListItemType>
sorted<ListItemType>::sorted() : itemCount(0), maxItems(DEFAULT_LIST_SIZE)
{
} // end default constructor
主要CPP档案
#include <iostream>
#include "sorted.h"
#include <cstddef>
using namespace std;
int main()
{
sorted<string> test;
return 0;
}
当我编译时,我得到错误/警告 1.重新定义'sorted :: sorted() 2. sorted :: sorted()'先前在此声明
当我在头文件#2的末尾注释掉#include“sorted.cpp”时,它可以工作,但是在我的主文件中,它没有对我的已排序的测试对象进行重新命名。
任何帮助都会很棒,提前谢谢。
答案 0 :(得分:1)
答案 1 :(得分:0)
如果你在最后添加sorted.cpp文件,那么你必须意识到sorted.cpp不是一个单独的模块 - 它只是模板类实现的实现。因此,您应该从该.cpp文件中删除前三行。
#include "sorted.h"
#include <cstddef>
using namespace std;
上面的那些行不应该在模板实现文件中。
另外,我会将sorted.cpp重命名为sorted.ipp或其他某些扩展名,表明它只是一个模板实现文件而不是一个单独的源模块进行编译。