Ошибка при создании шаблона класса - PullRequest
0 голосов
/ 06 июня 2010

Я нашел эту реализацию класса векторного шаблона, но она не компилируется в 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, но теперь я получаю новую ошибку: «Ожидаемый конструктор, деструктор или преобразование типов перед« <'token ».Аналогичная ошибка отображается и для каждого члена. </p>

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2010

Это всегда хорошая идея, чтобы поместить ваши шаблоны в заголовочный файл. Таким образом, вы не перепутаете компоновщик с несколькими определениями одного и того же экземпляра и тому подобное.

И, конечно, есть круговое включение:).

0 голосов
/ 06 июня 2010

Во-первых, у вас есть

 #include "myvector.cpp"

, который создает циклическую ссылку между файлами. Просто избавься от этого.

Другая проблема заключается в том, что вы определяете класс шаблона внутри файла .cpp. Определения шаблона разрешены только внутри заголовочных файлов. Могут быть способы обойти это, но для g ++ (который использует XCode) это то, как печенье рушится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...