7

我已经搜索并搜索了我的问题的解决方案,但我似乎找不到一个。我正在使用 Code::Blocks 并且收到模板类的重新定义错误。

这是我的“vectorAux.h”文件:

#ifndef vectoraux_h
#define vectoraux_h

#include <vector>
#include <algorithm>
#include <iostream>

template <typename T>
void removeDup(std::vector<T> & v);

template <typename T>
unsigned seqVectSearch(const std::vector<T> & v, unsigned first,
               unsigned last, const T& target);

template <typename T>
void writeVector(const std::vector<T> & v);

#include "vectorAux.cpp"
#endif

这是我的“vectorAux.cpp”文件:

#include "vectorAux.h"

#include <vector>
#include <algorithm>
#include <iostream>

template <typename T>
void removeDup(std::vector<T> & v)
{
    std::vector<int> vector1;
    unsigned i, last = v.size();

    for(int j = 0; j <= v.size(); j++)
    {
        std::cout << seqVectSearch(v, j, last, j);
        if(seqVectSearch(v, j, last, j) != v[i])
            vector1.push_back(seqVectSearch(v, j, last, j));
    }
}

template <typename T>
unsigned seqVectSearch(const std::vector<T> & v, unsigned first,
                       unsigned last, const T& target)
{
    unsigned i = first;
    while((v[i] != target) && (v[i] <= last))
    {
        if(v[i] == target)
            return i;
        i++;
    }
    return last;
}

template <typename T>
void writeVector(const std::vector<T> & v)
{
    unsigned i;
    unsigned n = v.size();

    for (i = 0; i < n; i++)
        std::cout << v[i] << ' ';
    std::cout << std::endl;
}

这个程序的最终文件是“vectorDriver.cpp”,但是这个没有错误。这个只是通过调用函数来运行程序:

#include "vectorAux.h"
#include <vector>
#include <iostream>

void fillVector(std::vector<int> & vect);

int main()
{
  using namespace std;

  vector<int> vect;

  fillVector(vect);
  cout << "Testing removeDup" << endl;
  cout << "Original vector is  ";
  writeVector(vect);

  removeDup(vect);
  cout << "Vector with duplicates removed is  ";
  writeVector(vect);
  cout << endl;
  writeVector(vect);

  return 0;
}

void fillVector(std::vector<int> & vect)
{
  int arr[] = {1,7,2,7,9,1,2,8,9};
  unsigned arrsize = sizeof(arr)/sizeof(int);

  vect = std::vector<int>(arr, arr+arrsize);
}

我真的很感激任何和所有的帮助/建议!我环顾四周,我发现的每个来源都说要保护头文件,但我已经这样做了,我的问题仍然存在。

4

5 回答 5

5

您在vectorAux.h 中包含vectorAux.cpp。我猜你也在单独编译vectorAux.cpp。所以你最终编译了vectorAux.cpp中的代码两次。

答案很简单,将vectorAux.cpp中的代码移到vectorAux.h,删除vectorAux.cpp,就不需要了。

模板代码几乎总是放在头文件中。

于 2012-10-23T07:16:11.267 回答
3

“VectorAux.cpp”的内容应该在“VectorAux.h”中,因为您定义了一个模板类。

于 2012-10-23T07:16:32.700 回答
2

简单的答案是:不应将模板拆分为源文件和头文件。使用模板时将其全部保存在头文件中。

于 2012-10-23T07:15:37.943 回答
1

从项目源文件中删除模板类的 .cpp。您当前正在编译 .cpp 文件两次;一次是因为它在您的项目中,其次是因为您的 .h 包含它。此外,从 .cpp 中删除 .h 包含,您不需要它,因为标题在底部包含 .cpp。这是分离模板类的不幸问题之一。

于 2016-05-15T05:31:48.930 回答
0

该错误发生在vectorAux.cpp文件编译期间,因为您包含头文件,而头文件又包含实现文件。这样,您最终会得到 cpp 文件的内容被复制

如果您确实想将模板函数的实现和声明拆分为两个单独的文件,您应该做两件事:

  1. 不要在实现文件中包含头文件。
  2. 不要将 cpp 文件添加到编译器正在翻译的文件中。

这两个选项中的任何一个都将消除您的编译器错误,但您确实应该两者都做。

于 2016-05-15T20:13:35.133 回答