переопределение шаблона & lt; class T & gt; в переполнении стека

Я искал и искал решение своей проблемы, но, похоже, не могу его найти. Я использую 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

Решение

Содержимое вашего «VectorAux.cpp» должно быть внутри «VectorAux.h», потому что вы определяете шаблон учебный класс.

2

Другие решения

Вы включаете vectorAux.cpp в vectorAux.h. Я предполагаю, что вы также компилируете vectorAux.cpp отдельно. Таким образом, вы в конечном итоге компилируете код в vectorAux.cpp дважды.

Ответ прост, переместите код из vectorAux.cpp в vectorAux.h, удалите vectorAux.cpp, он вам не нужен.

Код шаблона почти всегда помещается в заголовочные файлы.

1

Ответ прост: шаблоны не следует разбивать на исходные и заголовочные файлы. Храните все это в заголовочном файле при использовании шаблонов.

0

Удалите ваш .cpp вашего шаблонного класса из исходных файлов вашего проекта. В настоящее время вы компилируете файл .cpp дважды; один раз, потому что он есть в вашем проекте, и второй, потому что ваш .h включает его. Кроме того, удалите включение .h из вашего .cpp, оно вам не нужно, так как заголовок включает в себя .cpp внизу. Это одна из печальных проблем выделения шаблонных классов.

0

Ошибка происходит во время компиляции vectorAux.cpp файл, потому что вы включаете заголовочный файл, который, в свою очередь, включает в себя файл реализации. Таким образом, вы получите содержимое файла cpp. дублируется.

Если вы действительно хотите разделить реализацию и объявление функций шаблона на два отдельных файла, вам нужно сделать две вещи:

  1. Не включайте заголовочный файл в файл реализации.
  2. Не добавляйте файл cpp в файлы, переводимые компилятором.

Любая из этих двух опций избавит вас от ошибки компилятора, но вы действительно должны сделать и то, и другое.

0
По вопросам рекламы [email protected]