2012-04-12 3 views
-3

(* я должен использовать свой массив-структуру, и она должна быть динамическая)Шаблон - класс объекта - структура класса объектов

Я хочу Array структура наполняться Expe объектов класса. Я использую шаблоны, но почему-то мой заголовок структуры не распознает шаблон, который я создал.

Struct Заголовок:

template <class T>; 
struct Arr{ 
    int days; 
    T * M; 
}; 
typedef Arr* Array; 

Struct каст:

void constr(Array &o){ 
    //Construct of 31*1 Matrix 
    o=new Arr; 
    o->days = 31; 
    o->M = new T[o->days]; 

Это должно быть хорошо, я думаю, но я получаю сообщение об ошибке:

..\ListStruc.cpp:26:13: error: expected type-specifier before 'T' 
+0

Где другие 90% вопросов, которые включают код? – Jon

+0

добавил, я нажал ввести по ошибке ... –

+0

Я понятия не имею, связаны ли они с проблемой (я не могу составить головы или хвосты вопроса), но я уверен, что они будут полезны: [Почему можно ли создавать шаблоны только в файле заголовка?] (http://stackoverflow.com/questions/495021), [Что такое правило три?] (http://stackoverflow.com/questions/4172722) и [ Почему использование 'new' вызывает утечку памяти в C++?] (Http://stackoverflow.com/questions/8839943/why-does-the-use-of-new-cause-memory-leaks-in-c/ 8840302) –

ответ

1

У вас есть точка с запятой между template<class T> и struct Arr, которого там нет. Поэтому изменить его

template <class T> struct Arr{ int days; T * M; }; 

Кроме того Arr шаблон, и поэтому вы не можете Arr* на определение типа во Array, только Arr<someConcreteType>*.

Последние функции шаблона должны быть реализованы в заголовке и, как уже упоминалось вы ЬурейеЕ не работает так ставить constr в заголовок и изменить его на:

template<class T> void constr(Arr<T>*& o){ 
    o=new Arr<T>; 
    o->days = 31; 
    o->M = new T[o->days]; 

Там могут быть и другие проблемы, но это что я вижу из вопроса.

Конечно, есть проблемы с кодом, кроме компиляции (нарушение the rule of three и отсутствие безопасности исключений).

+0

Я думаю, что здесь есть четкий конкретный класс, 'Expe', поэтому вы сможете написать' typedef Arr * Array'. Это позволит вам написать 'const (Array & o) {...}' в .cpp-файле (т. Е. Не templated), но, конечно, вам понадобится 'o-> M = new Expe [o-> days ]; ' – MSalters

0

Вы должны удалить точку с запятой в объявлении структуры. Также, когда вы создаете объект этого типа, вы должны указать имя класса шаблона. И вы не можете поместить указатель в ссылку. На самом деле вы не можете положить что-либо в ссылку, это константы. Используйте указатель вместо ссылки в качестве параметра функции constr.

+0

ссылки наиболее определенно не константы. Шаблон не создается, но другой, то, что позиционирование указателя в ссылке работает отлично, поэтому 'Arr * &' является абсолютно допустимым кодом и может использоваться как OP хочет. Единственная причина использовать указатель (на указатель) в этот момент должна была бы уточнить, что он изменен, но это чисто вопрос предпочтения, а не необходимости. – Grizzly