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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 13:34   #1
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
Вопрос LNK2020: template в многофайловом проекте

Уважаемые товарищи. После того, как я изменил свой класс стек для работы с элементами разных типов, компилятор начал выдавать мне ошибки.
Visual Studio 2010 > New Project > Visual C++ > CLR > Windows Form.
Что не так? Без template все работало на ура!

Код:
1>kr_v12_1_0.obj : error LNK2020: неразрешенная лексема (06000019) CStack<int>::.ctor
1>kr_v12_1_0.obj : error LNK2020: неразрешенная лексема (0600001A) CStack<int>::~CStack<int>
1>kr_v12_1_0.obj : error LNK2020: неразрешенная лексема (0600001B) CStack<int>::IsEmpty
1>kr_v12_1_0.obj : error LNK2020: неразрешенная лексема (0600001C) CStack<int>::Push
1>kr_v12_1_0.obj : error LNK2020: неразрешенная лексема (0600001D) CStack<int>::Pop
1>E:\DES\IT\VisualStudio\SamGTU\kr_v12_1_0\Debug\kr_v12_1_0.exe : fatal error LNK1120: 5 неразрешенных внешних элементов
stack.h
Код:
#ifndef STACK_H
#define STACK_H
#pragma once

//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
ref class CStack
{
private:
	ref struct CElement
	{
		ElementType ^pElement;
		CElement ^pCNext;
	};
	
	// активный элемент стека
	// последний добавленный, первый при выборке
	CElement ^_pCRoot;

public:
	CStack(void);
	~CStack();

	bool IsEmpty();
 	void Push(ElementType ^pElement);
  	ElementType ^Pop();

};
//////////////////////////////////////////////////////////////////////////
#endif	// STACK_H

stack.cpp
Код:
#include "stdafx.h"
#include "stack.h"

using namespace std;
//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
CStack<ElementType>::CStack(void)
{
	_pCRoot = nullptr;
}
//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
CStack<ElementType>::~CStack()
{
	try
	{
		while ( !IsEmpty() )
			Pop();
	}

	catch (...)
	{
		DebugMessageError(L"Деструктор");
	}

}
//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
bool CStack<ElementType>::IsEmpty()
{
	return nullptr == _pCRoot;
}
//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
void CStack<ElementType>::Push(ElementType ^pElement) {
	try
	{
		CElement ^pCElement = gcnew CElement;
		pCElement->pElement = pElement;
		pCElement->pCNext = _pCRoot;
		_pCRoot = pCElement;
	}
	
	//catch (CMemoryException* e)
	//{
	//	DebugMessageError(L"Нехватка памяти. Вероятно, в стеке слишком много элементов." + global);
	//}
	catch (...)
	{
		DebugMessageError(L"Элемент не был помещен в стек.");
	}

}
//////////////////////////////////////////////////////////////////////////
template<typename ElementType>
ElementType ^CStack<ElementType>::Pop() {
	try
	{
		if (!IsEmpty())
		{
			ElementType ^pElement = _pCRoot->pElement;
			_pCRoot = _pCRoot->pCNext;
			return pElement;
		}

		throw(L"Выборка пустого стека");
	}
	
	catch (...)
	{
		DebugMessageError(L"Выборка стека.");
		return nullptr;
	}
	
}
//////////////////////////////////////////////////////////////////////////

main.cpp
Код:
// kr_v12_1_0.cpp: главный файл проекта.


#include "stdafx.h"
#include "Form1.h"
#include "stack.h"

using namespace kr_v12_1_0;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// включение визуальных эффектов Windows XP до создания каких-либо элементов управления
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// создание главного окна и его запуск
	//Application::Run(gcnew Form1());


	//////////////////////////////////////////////////////////////////////////
	// ОТЛАДКА

 	CStack<int> ^stack = gcnew CStack<int>;

	int ^pi = gcnew int;
	pi = 200;
	stack->Push(pi);
	pi = 100;
	stack->Push(pi);
	pi = 25;
	stack->Push(pi);

	while (!stack->IsEmpty())
		stack->Pop();

	MessageBox::Show("OK", TITLE, MessageBoxButtons::OK, MessageBoxIcon::None);

	// КОНЕЦ ОТЛАДКИ
	//////////////////////////////////////////////////////////////////////////

	return 0;

}
AntyDES вне форума Ответить с цитированием
Старый 14.12.2011, 19:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

шаблоны нельзя выносить в cpp файл.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.12.2011, 12:22   #3
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
шаблоны нельзя выносить в cpp файл.
но в h-файле можно делать только объявления функций, если я напишу в нем реализацию - компилятор будет ругаться. Что же тогда делать?
AntyDES вне форума Ответить с цитированием
Старый 15.12.2011, 13:42   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

не только
не будет
писать пока в хедере или инклуде, если не охота засорять
p51x вне форума Ответить с цитированием
Старый 15.12.2011, 13:46   #5
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
не только
или инклуде, если не охота засорять
так так, а по-подробнее?
AntyDES вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Template / Lambda BOBAH13 Общие вопросы C/C++ 1 09.12.2011 12:40
template, typedef и наследование valdemar593 Общие вопросы C/C++ 2 12.03.2011 18:46
Content + Template + style sealmu WPF, UWP, WinRT, XAML 0 25.02.2011 14:22
template Bogdanm Общие вопросы C/C++ 2 22.04.2010 00:20
Помогите пожалуйста с ШАБЛОНАМИ<Template> Suren Общие вопросы C/C++ 2 16.06.2009 19:16