Я нашел эту реализацию класса векторного шаблона, но он не компилируется на XCode.Ошибка при создании класса шаблона
Заголовочный файл: файл
// File: myvector.h
#ifndef _myvector_h
#define _myvector_h
template <typename ElemType>
class MyVector
{
public:
MyVector();
~MyVector();
int size();
void add(ElemType s);
ElemType getAt(int index);
private:
ElemType *arr;
int numUsed, numAllocated;
void doubleCapacity();
};
#include "myvector.cpp"
#endif
Реализация:
// File: myvector.cpp
#include <iostream>
#include "myvector.h"
template <typename ElemType>
MyVector<ElemType>::MyVector()
{
arr = new ElemType[2];
numAllocated = 2;
numUsed = 0;
}
template <typename ElemType>
MyVector<ElemType>::~MyVector()
{
delete[] arr;
}
template <typename ElemType>
int MyVector<ElemType>::size()
{
return numUsed;
}
template <typename ElemType>
ElemType MyVector<ElemType>::getAt(int index)
{
if (index < 0 || index >= size()) {
std::cerr << "Out of Bounds";
abort();
}
return arr[index];
}
template <typename ElemType>
void MyVector<ElemType>::add(ElemType s)
{
if (numUsed == numAllocated)
doubleCapacity();
arr[numUsed++] = s;
}
template <typename ElemType>
void MyVector<ElemType>::doubleCapacity()
{
ElemType *bigger = new ElemType[numAllocated*2];
for (int i = 0; i < numUsed; i++)
bigger[i] = arr[i];
delete[] arr;
arr = bigger;
numAllocated*= 2;
}
Если я пытаюсь скомпилировать как есть, я получаю следующее сообщение об ошибке: «Переопределение 'MyVector :: MyVector()' " Эта же ошибка отображается для каждой функции-члена (файл .cpp).
Для того, чтобы исправить это, я удалил «#include„myvector.h“» на файл .cpp, но теперь я получаю новую ошибку: «Ожидаемое преобразование конструктор, деструктор, или типа, прежде чем„<“ лексема». Аналогичная ошибка отображается и для каждого члена.
Интересно, что если я переведу весь код .cpp в файл заголовка, он компилируется в порядке. Означает ли это, что я не могу реализовать классы шаблонов в отдельных файлах?
Это не значит, что они не разрешены * внутри .cpp-файла. Есть только проблемы с компиляцией и связыванием, если это сделано так, что присуще тому, как работают шаблоны (и отсутствие достойной поддержки ключевого слова 'export'). – Pieter