重新定义......,此前在此声明

时间:2014-02-04 01:21:48

标签: c++ class

我知道有很多这样的问题,但我找不到适合我的解决方案。无论如何,我有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”时,它可以工作,但是在我的主文件中,它没有对我的已排序的测试对象进行重新命名。

任何帮助都会很棒,提前谢谢。

2 个答案:

答案 0 :(得分:1)

你正在编译sorted.cpp吗?我想你不应该。

答案 1 :(得分:0)

如果你在最后添加sorted.cpp文件,那么你必须意识到sorted.cpp不是一个单独的模块 - 它只是模板类实现的实现。因此,您应该从该.cpp文件中删除前三行。

#include "sorted.h"
#include <cstddef>
using namespace std;

上面的那些行不应该在模板实现文件中。

另外,我会将sorted.cpp重命名为sorted.ipp或其他某些扩展名,表明它只是一个模板实现文件而不是一个单独的源模块进行编译。