2010-06-06 5 views
0

Я нашел эту реализацию класса векторного шаблона, но он не компилируется на 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 в файл заголовка, он компилируется в порядке. Означает ли это, что я не могу реализовать классы шаблонов в отдельных файлах?

ответ

0

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

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

0

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

#include "myvector.cpp" 

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

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

+1

Это не значит, что они не разрешены * внутри .cpp-файла. Есть только проблемы с компиляцией и связыванием, если это сделано так, что присуще тому, как работают шаблоны (и отсутствие достойной поддержки ключевого слова 'export'). – Pieter

Смежные вопросы