Я искал и искал решение своей проблемы, но, похоже, не могу его найти. Я использую 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);
}
Я был бы очень признателен за любую помощь / совет, который предоставляется! Я какое-то время оглядывался по сторонам, и каждый найденный мной источник защищал заголовочный файл, но я уже сделал это, и моя проблема все еще возникает.
Содержимое вашего «VectorAux.cpp» должно быть внутри «VectorAux.h», потому что вы определяете шаблон учебный класс.
Вы включаете vectorAux.cpp в vectorAux.h. Я предполагаю, что вы также компилируете vectorAux.cpp отдельно. Таким образом, вы в конечном итоге компилируете код в vectorAux.cpp дважды.
Ответ прост, переместите код из vectorAux.cpp в vectorAux.h, удалите vectorAux.cpp, он вам не нужен.
Код шаблона почти всегда помещается в заголовочные файлы.
Ответ прост: шаблоны не следует разбивать на исходные и заголовочные файлы. Храните все это в заголовочном файле при использовании шаблонов.
Удалите ваш .cpp вашего шаблонного класса из исходных файлов вашего проекта. В настоящее время вы компилируете файл .cpp дважды; один раз, потому что он есть в вашем проекте, и второй, потому что ваш .h включает его. Кроме того, удалите включение .h из вашего .cpp, оно вам не нужно, так как заголовок включает в себя .cpp внизу. Это одна из печальных проблем выделения шаблонных классов.
Ошибка происходит во время компиляции vectorAux.cpp
файл, потому что вы включаете заголовочный файл, который, в свою очередь, включает в себя файл реализации. Таким образом, вы получите содержимое файла cpp. дублируется.
Если вы действительно хотите разделить реализацию и объявление функций шаблона на два отдельных файла, вам нужно сделать две вещи:
Любая из этих двух опций избавит вас от ошибки компилятора, но вы действительно должны сделать и то, и другое.