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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2012, 00:00   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Неразрешенный внешний символ

Тут такая проблема есть 3 файла:
CORE.h - описание класса
CORE.cpp - реализация функций класса
Main.cpp - ну это не нуждается в объяснении

Содержание CORE.h
Код:
#ifndef CORE_H
#define CORE_H

using std::cout;
using std::endl;

namespace _NEO
{
	template<class UserType,const int SIZE> 
	class SortingMaxMin
	{
	public:
		SortingMaxMin(UserType *);
		void StartSorting();
		void DisplaySortingArray() const;
		UserType getMax() const { return Max; }
		UserType getMin() const { return Min; }
		UserType *getSortingArray() { return &ArrayNew[0]; }
		int getIndexMax() const { return IndexMax; }
		int getSize() const { return SIZE; }
	protected:
		void Copy(UserType *);
		bool Check(int);
		void setMin(UserType = 0);
		void setMax(UserType = 0);
		UserType getMaxElementArray();
		UserType getMinElementArray();
		UserType ArrayTemp[SIZE];
		UserType ArrayNew[SIZE];
		UserType Max;
		UserType Min;
		bool copy;
	private:
		int IndexMax;
	};
}

#endif
Содержание CORE.cрр
Код:
#include <iostream>
#include "CORE.h"

namespace _NEO
{
	template<class UserType,const int SIZE>
	SortingMaxMin<UserType,SIZE>::SortingMaxMin(UserType *ptrArray)
	{
		Check(110);
		setMax();
		setMin();
		IndexMax = -1;
		copy = false;
		Copy(ptrArray);
		Check(115);
	}

	template<class UserType,const int SIZE>
	void SortingMaxMin<UserType,SIZE>::StartSorting()
	{
		for(int i = 0; i < SIZE; i++)
		{
			ArrayNew[i] = getMaxElementArray();;
			ArrayTemp[getIndexMax()] = getMinElementArray();
		}
	}

	template<class UserType,const int SIZE>
	void SortingMaxMin<UserType,SIZE>::DisplaySortingArray() const
	{
		for(int i = 0; i < SIZE; i++)
			cout << "Element #" << i + 1 << ":\t" << ArrayNew[i] << '\n'
		cout << endl; 
	}

	template<class UserType,const int SIZE>
	void SortingMaxMin<UserType,SIZE>::Copy(UserType *ptrArray)
	{
		for(int i = 0; i < SIZE; i++)
			ArrayTemp[i] = ptrArray[i];
		copy = true;
	}

	template<class UserType,const int SIZE>
	UserType SortingMaxMin<UserType,SIZE>::getMaxElementArray()
	{
		UserType max = ArrayTemp[0];
		for(int i = 0; i < SIZE; i++)
			if(max < ArrayTemp[i])
			{
				max = ArrayTemp[i];
				IndexMax = i;
			}
		setMax(max);

		return max;
	}

	template<class UserType,const int SIZE>
	UserType SortingMaxMin<UserType,SIZE>::getMinElementArray()
	{
		UserType min = ArrayTemp[0];

		for(int i = 0; i < SIZE; i++)
			if(min > ArrayTemp[i])
				min = ArrayTemp[i];
		setMin(min);

		return min;
	}

	template<class UserType,const int SIZE>
	bool SortingMaxMin<UserType,SIZE>::Check(int code)
	{
		if(code == 110 && SIZE <= 0)
		{
			cout << "ERROR #110" << endl;
			system("PAUSE");
			exit(1);
		}
		if(code == 115 && copy == false)
		{
			cout << "ERROR #115" << endl;
			system("PAUSE");
			exit(1);
		}
		return true;
	}

	template<class UserType,const int SIZE>
	void SortingMaxMin<UserType,SIZE>::setMax(UserType inMax)
	{
		Max = inMax;
	}

	template<class UserType,const int SIZE>
	void SortingMaxMin<UserType,SIZE>::setMin(UserType inMin)
	{
		Min = inMin;
	}
}
ну и наконец то Main.cpp
Код:
#include <iostream>
#include "CORE.h"

int main()
{
	float Array[90];
	float a = 1;
	for(int i = 0; i < 90; i++,a++)
		Array[i] = a / 164;

	_NEO::SortingMaxMin<float,90> sort(&Array[0]);
	
	sort.StartSorting();
	sort.DisplaySortingArray();
	system("PAUSE");
	return 0;
}
А вот ошибки
Код:
MAIN.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall _NEO::SortingMaxMin<float,90>::DisplaySortingArray(void)const " (?DisplaySortingArray@?$SortingMaxMin@M$0FK@@_NEO@@QBEXXZ) в функции _main
1>MAIN.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall _NEO::SortingMaxMin<float,90>::StartSorting(void)" (?StartSorting@?$SortingMaxMin@M$0FK@@_NEO@@QAEXXZ) в функции _main
1>MAIN.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall _NEO::SortingMaxMin<float,90>::SortingMaxMin<float,90>(float *)" (??0?$SortingMaxMin@M$0FK@@_NEO@@QAE@PAM@Z) в функции _main
1>C:\Documents and Settings\Admin\мои документы\visual studio 2010\Projects\Project_1\Debug\Project_1.exe : fatal error LNK1120: 3 неразрешенных внешних элементов
В чем дело? Просто когда реализацию функций класса вставляешь в CORE.h(где описан интерфейс класса) все работает нормально, а когда реализуешь отдельно то вот такие ошибки. И что самое такое они вылетают для тех функций, которые вызываются из main(). Может с шаблонными классами так нельзя делать (отделять реализацию от интерфейса)?

Помогите. Заранее спасибо.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 23.06.2012, 00:25   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Книга подскажет.
Вандервуд, Джоссатис - Шаблоны с++, глава 10, 165 страница, "Инстанцирование"
_Bers вне форума Ответить с цитированием
Старый 23.06.2012, 01:16   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Хорошо спасибо. Почитаю
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 23.06.2012, 01:21   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

шаблоны нельзя отделять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2012, 01:30   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
шаблоны нельзя отделять.
Можно. Нужно только знать как.
_Bers вне форума Ответить с цитированием
Старый 23.06.2012, 01:32   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

специализированные можно выделить, обобщенные поидее нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2012, 01:39   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
специализированные можно выделить, обобщенные поидее нет.
Можно перенести весь шаблон целиком в единицу трасляции, оставив в хедерах только предварительные объявления вида:

Код:
template<class T> class TSome;
_Bers вне форума Ответить с цитированием
Старый 23.06.2012, 01:54   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

можно полноценный пример?
выделения реализации(не специализация) шаблонов в одну единицу трансляции, при том что в хидере должно быть обьявление шаблона для использования в другой единице трансляции.
что видим у ТС.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2012, 03:34   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2kineziz
если явно не проинстанцируешь шаблон на все типы, с которыми собираешься его использовать, то так делать нельзя, кидай все в один хидер. если тебе хочется разделить "для красоты", просто добавь в свой хидер
Код:

#ifndef CORE_H
#define CORE_H

using std::cout;
using std::endl;

namespace _NEO
{
	template<class UserType,const int SIZE> 
	class SortingMaxMin
	{
	public:
		SortingMaxMin(UserType *);
		void StartSorting();
		void DisplaySortingArray() const;
		UserType getMax() const { return Max; }
		UserType getMin() const { return Min; }
		UserType *getSortingArray() { return &ArrayNew[0]; }
		int getIndexMax() const { return IndexMax; }
		int getSize() const { return SIZE; }
	protected:
		void Copy(UserType *);
		bool Check(int);
		void setMin(UserType = 0);
		void setMax(UserType = 0);
		UserType getMaxElementArray();
		UserType getMinElementArray();
		UserType ArrayTemp[SIZE];
		UserType ArrayNew[SIZE];
		UserType Max;
		UserType Min;
		bool copy;
	private:
		int IndexMax;
	};
}

#include "CORE.cpp"

#endif
CORE.cpp в компиляции участвовать не должен, т.е для компиляции твоей проги достаточно передать компилятору только main.cpp
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.06.2012, 05:10   #10
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Прочитал 10 главу нечего не понял. Хотелось бы как обычный класс разделить интерфейс от реализации. Т.е. интерфейс(прототипы) в хенделе а релиз в .cpp

Можете кто нить поподробнее объяснить про единицу трансляции и как это воще реализовать пробовал из книги делать не получилось ошибки......
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неразрешенный внешний символ lampo Visual C++ 3 12.05.2012 11:09
Неразрешенный внешний символ Митовей Общие вопросы C/C++ 1 08.04.2012 23:34
Ошибка: ссылка на неразрешенный внешний символ Cthutq66a Помощь студентам 7 06.11.2011 12:10
Ссылка на неразрешенный внешний символ Xenogig Общие вопросы C/C++ 4 07.05.2011 19:11
Ссылка на неразрешенный внешний символ(error LNK2019) TheWanderer Общие вопросы C/C++ 2 07.08.2009 19:58