2013-02-10 6 views
0

У меня динамический массив на основе класса, который я звоню MyList, который выглядит следующим образом:аргумент шаблона требуется для класса

#ifndef MYLIST_H 
#define MYLIST_H 
#include <string> 
#include <vector> 

using namespace std; 

template<class type> 
class MyList 
{ 
public: 
    MyList(); 
    ~MyList(); 
    int size() const; 
    type at() const; 
    void remove(); 
    void push_back(type); 

private: 
    type* List; 
    int _size; 
    int _capacity; 
    const static int CAPACITY = 80; 
}; 

#endif 

У меня также есть еще один класс, который я называю User, что я хочу для включения экземпляра MyList в качестве частного элемента данных. Пользователь выглядит следующим образом:

#ifndef USER_H 
#define USER_H 
#include "mylist.h" 
#include <string> 
#include <vector> 

using namespace std; 

class User 
{ 
public: 
    User(); 
    ~User(); 

private: 
    int id; 
    string name; 
    int year; 
    int zip; 
    MyList <int> friends; 
}; 

#endif 

Когда я пытаюсь скомпилировать я получаю ошибку в моем user.cpp файле:

неопределенная ссылка на MyList::Mylist()

Я нахожу это странным, потому что MyList полностью не связанный с user.cpp, в котором содержится только мой конструктор и деструктор User.

+2

Вы когда-нибудь реализовывали конструктор? – 0x499602D2

+3

Определения шаблона класса должны быть доступны при их создании. Вы не можете определить свой шаблон в исходном файле, как обычно, с не-шаблонами. Переместите определение в файл заголовка или включите определение из файла заголовка. – mfontanini

+0

Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – Mat

ответ

1

Убедитесь, что вы пишете как декларацию и определение класса шаблона в заголовке (определяют MyList в заголовке не в файле .cpp)

+0

Каким будет формат объявления класса шаблона в заголовке? –

+0

@ DanielHwang Определение уже является декларацией. – Potatoswatter

+0

Спасибо за быстрые ответы, так что я должен добавить в заголовок? –

0

Причина заключается в том, что вы не предоставили MyClass<int> определение конструктора. К сожалению, на C++ вы не можете разделить определение класса шаблона, объявив методы в файле заголовка и определяя их в реализации. По крайней мере, если вы хотите использовать его в других модулях. Поэтому в вашем случае для класса пользователя должно быть значение MyClass<int>::MyClass(). Есть два способа сделать это:

  1. (самый простой) обеспечивают право определения конструктора на месте: MyClass() { ... } или

  2. добавить определение метода в MyClass.h после определения класса, как, что: template<class type> MyList<type>::MyList() { ... }