我搜索并搜索了我的问题的解决方案,但我似乎找不到。我正在使用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);
}
我非常感谢所有给出的帮助/建议!我已经浏览了一段时间,我找到的每个来源都说要保护头文件,但我已经这样做了,我的问题仍然存在。
答案 0 :(得分:2)
在vectorAux.h中包含vectorAux.cpp。我猜你也在分别编译vectorAux.cpp。所以你最终在vectorAux.cpp中编译代码两次。
答案很简单,将代码从vectorAux.cpp移到vectorAux.h,删除vectorAux.cpp,你不需要它。
模板代码几乎总是在头文件中。
答案 1 :(得分:2)
“VectorAux.cpp”的内容应该在“VectorAux.h”中,因为你定义了一个模板类。
答案 2 :(得分:1)
简单的答案是:不应将模板拆分为源文件和头文件。使用模板时,请将其全部保存在头文件中。
答案 3 :(得分:1)
从项目源文件中删除模板化类的.cpp。您当前正在编译.cpp文件两次;一次,因为它在你的项目中,其次是因为你的.h包括它。此外,从.cpp中删除.h包含,您不需要它,因为标题包含底部的.cpp。这是分离模板类的一个不幸的问题。
答案 4 :(得分:0)
在编译vectorAux.cpp
文件期间发生错误,因为您包含头文件,而头文件又包含实现文件。这样,您最终得到的cpp文件内容为重复。
如果您确实想将模板函数的实现和声明拆分为两个单独的文件,那么您应该做两件事:
这两个选项中的任何一个都将摆脱编译错误,但你真的应该这两个。