Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 19:48   #1
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию шаблоны и typedef в С++

хочу сделать шаблонный стек. Сделал нешаблонный - работает корректно. Переделывая в шаблонный столкнулся с задачей - написать шаблонный typedef.
Код:
 template <class Type> typedef struct SteckEl
{
	Type Value;
	struct SteckEl<Type>* Next;
	
} STACKEL<Type>;
ошибкает:
C:\Documents and Settings\User1\Ðàáî÷èé ñòîë\stack\stack.cpp(10) : error C2059: syntax error : '<end Parse>'
не понимаю где не правильно(
EniOk вне форума Ответить с цитированием
Старый 27.02.2011, 19:54   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Блин, я если честно, вообще не понял, чего ты хочешь добиться, написав там typedef. Можешь словами объяснить?
Что было до (и работало), что стало после?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 27.02.2011, 20:01   #3
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

до - простой стек.
Код:
 typedef struct SteckEl
{
	int Value;
	struct SteckEl* Next;
	
} STACKEL;

class CStack
{
private:
	STACKEL* top;
public:
	CStack()
	{
		CStack::top = NULL;
	}
	int ShowTop();
	STACKEL* ShowTopAdress();
	STACKEL* Push(int);
	int Pop();

};
после -
Код:
 template <class Type> typedef struct SteckEl
{
	Type Value;
	struct SteckEl<Type>* Next;
	
} STACKEL<Type>;

template <class Type> class CStack
{
private:
	STACKEL* top;
public:
	CStack()
	{
		CStack::top = NULL;
	}
	Type ShowTop();
	STACKEL* ShowTopAdress();
	STACKEL* Push(Type);
	Type Pop();

};
в общем - я объявляю тип - элемент стека.

Последний раз редактировалось Stilet; 28.02.2011 в 20:42.
EniOk вне форума Ответить с цитированием
Старый 27.02.2011, 21:59   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

может быть вам так подойдет
Код:
template <class T> struct SteckEl {
	T Value;
	struct SteckEl* Next;
	
};

template <class T> class CStack
{
private:
	SteckEl<T>* top;
public:
	CStack()
	{
		CStack::top = NULL;
	}
	T ShowTop();
	SteckEl<T>* ShowTopAdress();
	SteckEl<T>* Push(T);
	T Pop();

};
onewho вне форума Ответить с цитированием
Старый 27.02.2011, 22:31   #5
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Код:
template <class Type>  struct STACKEL
{
	Type Value;
	struct STACKEL* Next;
	
};

template <class Type> class CStack
{
private:
	STACKEL<Type>* top;
public:
	CStack()
	{
		CStack::top = NULL;
	}
	Type ShowTop();
	STACKEL<Type>* ShowTopAdress();
	STACKEL<Type>* Push(Type);
	Type Pop();

};

template <class Type> STACKEL<Type>* CStack<Type>::Push(Type Value)
{
	STACKEL<Type>* Element = (STACKEL<Type>*) malloc(sizeof(STACKEL<Type>));
	Element->Next = CStack::top;
	Element->Value = Value;
	CStack::top = Element;
	return Element;
};
Ругаеца так:
Цитата:
Compiling...
stack.cpp
C:\Documents and Settings\User1\Ðàáî÷èé ñòîë\stack\stack.cpp(74) : error C2440: '=' : cannot convert from 'struct STACKEL<int> *' to 'struct STACKEL *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Documents and Settings\User1\Ðàáî÷èé ñòîë\stack\stack.cpp(38) : while compiling class-template member function 'struct STACKEL<int> *__thiscall CStack<int>::Push(int)'
на строку
Код:
	Element->Next = CStack::top;
что делать(

если заменить
Код:
template <class Type>  struct STACKEL
{
	Type Value;
	struct STACKEL<Type> * Next;
	
};
- ругается на то что шаблон уже был...
EniOk вне форума Ответить с цитированием
Старый 27.02.2011, 22:44   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Как то не красиво в коде стиле С++ использовать функции Си. Вместо
Код:
STACKEL<Type>* Element = (STACKEL<Type>*) malloc(sizeof(STACKEL<Type>));
напиши
Код:
STACKEL<Type>* Element = new STACKEL<Type>;
profi вне форума Ответить с цитированием
Старый 28.02.2011, 00:22   #7
epifanova
Новичок
Джуниор
 
Регистрация: 28.02.2011
Сообщений: 1
По умолчанию

С++ без боли и слез: осваиваем программирование с инструктором
http://cppnewb.ru/?p=164.
epifanova вне форума Ответить с цитированием
Старый 28.02.2011, 09:10   #8
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

первый ответ не исправит ошибку, а второй - реклама(
EniOk вне форума Ответить с цитированием
Старый 28.02.2011, 09:16   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

EniOk вот не нужно "не исправит ошибку". Все даже исправит. Я же не с потолка сказал, а проверил с начало в компиляторе. Ставь Code::Blocks + MinGW и выкинь этот бред от Майкрософта. Кстати при создании/удалении объекта функциями malloc/free конструктор и деструктор не вызываются.

Последний раз редактировалось profi; 28.02.2011 в 09:28.
profi вне форума Ответить с цитированием
Старый 28.02.2011, 11:41   #10
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
CStack
Венгерская нотация это плохо. http://www.insidecpp.ru/art/23/
Лучше просто грамотно именуйте всё.
Названия классов, названия и элементы enum'ов: ThereIsSomeText.
Названия функций и методов: thereIsSomeText.
Названия переменных: there_is_some_text. При этом перед полями класса ставьте m_ (m_there_is_some_text). Перед константами - k_ (k_there_is_some_text). Соответственно, константные поля будут иметь префикс mk_.
Названия макросов: THEREISSOMETEXT. Но макросов нынче хорошие мальчики избегают .

Вот пример. Если класс у вас представляет картинную галерею, то у неё должны быть методы bool isClosed() (закрыта ли сейчас галерея), const Picture &pictureAt(unsigned num) const (константная ссылка на картину по номеру), unsigned numOfPictures() const (общее число картин в галерее), void addPicture(const &Picture picture) (добавление картины). И поля будут такие: Picture[] m_pictures, unsigned m_num_of_pictures. И не надо никакой венгерской нотации. Из названия сразу понятно, что означает какое-то поле и какой у него тип.

А теперь по теме.
Цитата:
typedef struct SteckEl
{
int Value;
struct SteckEl* Next;

} STACKEL;
Наследие C? Просто пишите без typedef. typedef нужен для другого.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны Freddi Krjuger Общие вопросы C/C++ 6 14.11.2010 20:55
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Для чего используют typedef prikolist Общие вопросы C/C++ 17 16.04.2009 15:36
Использование typedef с vector <type> kezman Общие вопросы C/C++ 2 19.07.2008 21:17
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 09:50