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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 17:34   #1
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию Ошибка компоновщика

Помогите плиз,

выскаивает ошибка
Код:
 
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall stack<char>::_interface_(void)" (?_interface_@?$stack@D@@QAEXXZ) в функции _main
Вот сам код:

Код:
#include <iostream>
#include <windows.h>
#include<conio.h>
#include "stack.h"
#include "node.h"
#include "iterator_stack.h"
using namespace std;


void main()
{
	setlocale(LC_ALL,"");
	do
	{
		system("cls");
		cout<<"Выберите тип данных: "<<endl
			<<"1 - char "<<endl
			<<"2 - int "<<endl
			<<"3 - long int"<<endl
			<<"4 - float"<<endl
			<<"5 - double"<<endl
			<<"6 - long double"<<endl	
			<<"0 - выход"<<endl;
		fflush(stdin);
		switch (_getch())
		{
		case '1': { stack<char> *p=new stack<char>; p->_interface_(); break; }//error LNK2019
		case '2': { stack<int> *p=new stack<int>; p->_interface_(); break; }//error LNK2019
		case '3': { stack<long> *p=new stack<long>; p->_interface_(); break; }//error LNK2019
		case '4': { stack<float> *p=new stack<float>; p->_interface_(); break; }//error LNK2019
		case '5': { stack<double> *p=new stack<double>; p->_interface_(); break; }//error LNK2019
		case '6': { stack<long double> *p=new stack<long double>; p->_interface_(); break; }//error 
		case '0': exit(0);
		default: { stack<int> *p; 
			       cout<<"\nНеверный выбор действия"<<endl
					   <<"...По умолчанию тип даных в стеке - int...";
		  p=new stack<int>; p->_interface_(); break; }//error 

		}
		system("cls");
		cout<<"Продолжить работу программы: y/n? ";
	}while (_getch()!='n');
}
вот файлик stack.h:
Код:
 
#pragma once
#include "iterator_stack.h"
#include<conio.h>
#include<iostream>
#include "node.h"
using namespace std;

template<class TYPE> class iterator_stack;

template <class TYPE> 
class stack
{
	node<TYPE> *begin;
public:	
	friend class iterator_stack<TYPE>;
	typedef iterator_stack<TYPE> iterator;
	typedef node<TYPE>& reference;
	typedef node<TYPE>* pointer;
	typedef stack<TYPE> kontainer;

	stack () { begin=0; }
	stack (TYPE k) { add(k); }
	~stack () { delete begin; }	

	iterator begin_iterator();//возвращает итератор на 1 элемент
	reference begin_reference ();//возвращает ссылку на 1 элемент
	pointer begin_pointer ();//возвращает указатель на 1 элемент
	iterator empty_iterator ();//возвращает итератор на пустой элемент
	iterator add_in_position (iterator, TYPE);//вставляет элемент TYPE после позиции, на которую указывает итератор
	iterator add_second_stack_to_first (kontainer A,iterator B,kontainer C, iterator D,iterator E);
    /* Функция записывет в контейнер A после элемента B  часть  стека C с  элемента D по элемент E */
	void _interface_( );
	stack<TYPE>* add();
	void add(TYPE );
	void view();
	void find (TYPE);
	void delete_ (TYPE );
	void sort ();
	TYPE return_data() { return begin->data; }
};
вот сама функция void _interface_()
Код:
 
template<class TYPE>
void stack<TYPE>::_interface_()
{
	TYPE key;
	char c;
	do
		{
			system("cls");
			cout<<"Выберите действие: "<<endl
				<<"1 - добавить группы элементов в стек "<<endl
				<<"2 - добавить один элемент в стек "<<endl
				<<"3 - просмотр стека "<<endl
				<<"4 - поиск элемента по ключу"<<endl
				<<"5 - удаление элемента из стека"<<endl
				<<"6 - сортировка стека"<<endl
				<<"7 - итератор"<<endl
				<<"0 - выход"<<endl;
			fflush(stdin);
	метка:
			switch (c=_getch())
			{
			case '1': this->add(); break;
			case '2': 
				{		
					while(1)
					{
						cout<<"\nВведите информацию в узел: \n";
						cin>>key;
						break;
					}
					this->add(key);
					break;
				}
			case '3': 
				{					
				    this->view();
				    break;
				}
			case '4':
				{
					while(1)
					{
						cout<<"\nВведите ключ элемента: \n";
						cin>>key;
						break;
					}
					this->find(key);
					break;
				}
			case '5': 
				{
					while(1)
					{
						cout<<"\nВведите ключ элемента: \n";
						cin>>key;
						
						break;
					}
					this->delete_(key);
					break;
				}
			case '6': this->sort(); break;
			case '7':
				{
					iterator_stack<TYPE> it=this->begin_iterator();					
				}
			case '0': return;
			default: goto метка;
			}
			if (c!='1' && c!='4' && c!='3') 
			{
				system("cls");
				cout<<"Выполнено...\n";
				_getch();
			}
		}while(1);
}

Последний раз редактировалось senator2202; 13.12.2009 в 17:48.
senator2202 вне форума Ответить с цитированием
Старый 13.12.2009, 17:52   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

и в каком файле находится реализация функции void _interface_()
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 13.12.2009, 18:10   #3
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию

void _interface () находится в файле stack.cpp

В нем реализованы все функции класса stack<TYPE>
senator2202 вне форума Ответить с цитированием
Старый 13.12.2009, 18:11   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

объявление и реализация методов шаблонных классов должны находится в одном файле
netrino вне форума Ответить с цитированием
Старый 13.12.2009, 18:13   #5
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию

а на счет STL: да, я знаю что это намного удобнее и проще, просто поставлена конкретная задача
senator2202 вне форума Ответить с цитированием
Старый 13.12.2009, 18:16   #6
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию

в файле stack.cpp находятся все остальные шаблонные методы класса stack<TYPE> , компилятор не ругается, да и вся программа разбита на шаблонные h-файлы и cpp-файлы
так что дело не в этом, но все равно спасибо за совет
senator2202 вне форума Ответить с цитированием
Старый 13.12.2009, 18:18   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В таком случае вам придётся их все перенести в тот же файл, где происходит объявление класса-шаблона. Проблема в этом.
netrino вне форума Ответить с цитированием
Старый 13.12.2009, 18:21   #8
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию

попробовал, не помогло
senator2202 вне форума Ответить с цитированием
Старый 13.12.2009, 18:30   #9
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
в файле stack.cpp находятся все остальные шаблонные методы класса stack<TYPE> , компилятор не ругается, да и вся программа разбита на шаблонные h-файлы и cpp-файлы
так что дело не в этом, но все равно спасибо за совет
файл stack.cpp переименуй в stack.inc, а потом в файле stack.h в конце допиши #include "stack.inc"
что то типо этого
Код:
#ifndef stack_h__
#define stack_h__

#include "iterator_stack"

template<typename T>
class stack{
public:
	typedef iterator_stack<T> iterator;
	....
};

#include "stack.inc"

#endif // stack_h__
Проблема как сказал netrino в том что экспорт шаблонов почти всеми компиляторами не поддерживается..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 13.12.2009, 18:39   #10
senator2202
 
Регистрация: 13.12.2009
Сообщений: 8
По умолчанию

сделал, как вы посоветовали, но компилятор по прежнему на стадии компоновки выдает ошибки на прежних местах
senator2202 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26
Настройка компоновщика в Builder 2009 Innovator_King C++ Builder 1 01.10.2009 11:39
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44