LINUX.ORG.RU

Не понимаю как надо компилятору скормить реали3ацию класса с шаблоном?

 ,


0

1

Хочу со3дать класс с сортировками, пока что есть одна с квадратичной сложностью. Со3дал класс - каждый метод будет сортировкой, но для ра3ных типов данных. Компилятор ругается, файл main.cpp:


#include "Sorts.h"


int main()
{
	const int iSize = 10,
		dSize = 7,
		fSize = 10,
		cSize = 255;
	// массивы разных типов данных
	int    iArray[iSize] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	double dArray[dSize] = { 1.2345, 2.234, 3.57, 4.67876, 5.346, 6.1545, 7.7682 };
	float  fArray[fSize] = { 1.34, 2.37, 3.23, 4.8, 5.879, 6.345, 73.434, 8.82, 9.33, 10.4 };
	char   cArray[cSize];// = { "MARShdkeitocm8" };
	for (int i = 0; i < 255; i++)
		cArray[i] = i;
	
	auto sorti = new Sorts<int>();
	sorti->Sorting(iArray, iSize);
	auto sortd = new Sorts<double>();
	sortd->Sorting(dArray, dSize);
	auto sortf = new Sorts<float>();
	sortf->Sorting(fArray, fSize);
	//sort->Sorting(fArray, fSize);
	auto sortc = new Sorts<char>();
	sortc->Sorting(cArray, cSize);
	//sort->Sorting(cArray, cSize);
	std::cout << "\t\t Шаблон функции вывода массива на экран\n\n";
	// вызов локальной версии функции printArray для типа int через шаблон
	std::cout << "\nМассив типа int:\n"; 
	sorti->printArray(iArray, iSize);
	// вызов локальной версии функции printArray для типа double через шаблон
	std::cout << "\nМассив типа double:\n"; 
	sortd->printArray(dArray, dSize);
	// вызов локальной версии функции printArray для типа float через шаблон
	std::cout << "\nМассив типа float:\n"; 
	sortf->printArray(fArray, fSize);
	// вызов локальной версии функции printArray для типа char через шаблон
	std::cout << "\nМассив типа char:\n"; 
	sortc->printArray(cArray, cSize);
    return 0;
}

Файл Sorts.h

#pragma once
#include <iostream>
template <typename T> class Sorts
{
public:
	T* Sorting(T* mas, int size);
	void printArray(const T* arr, int count); // конец шаблона функции printArray;
};


и файл Sorts.cpp
#include "Sorts.h"

T* Sorts::Sorting(T* mas, int size)
{
	T tmp;
	for (int i = 0; i < size; i++)
		for (int j = 0; j < size; j++)
			if (mas[i] > mas[j])
			{
				tmp = mas[i];
				mas[i] = mas[j];
				mas[j] = tmp;
			}
	return (T*)mas;
}
void Sorts::printArray(const T* arr, int count)
{
	for (int ix = 0; ix < count; ix++)
		std::cout << arr[ix] << "   ";
	std::cout << std::endl;
} // конец шаблона функции printArray;
Ошибки все в файле реали3ации класса

Реализацию шаблона скрыть нельзя. У тебя *.cpp файл с реализацией ничего не знает про тип.

И хватит насмехаться над буквой з.

Result-Code ()
Ответ на: комментарий от bad_master

Поэтому тебе всё сложно и ты не знаешь куда расти.

l4gfcm ★★ ()
Ответ на: комментарий от pinus_nigra

Я вот как раз не могу понять, это школьник или студент из тех самых 95-ти процентов.

Так писать, вроде как, нарушение правил.

l4gfcm ★★ ()

Почему-то напомнило. На стене мат-меха как-то раз появилась надпись «хочу здать геометрию». Через весьма недолгое время ко второму слову приделали приставку «со».

Miguel ★★★★★ ()

Хочу со3дать класс

Слабовато хочешь, приложи больше усилий:

><04y C03D@Tb K/|@$$

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 3)

Реализация шаблонов должна быть в заголовках потому что шаблоны — это по сути препроцессор который подставляет шаблонные параметры и заново генерирует код для каждого случая. Можно посмотреть на таблицу символов или вывод дизассеблера чтобы в этом убедиться.

X512 ★★★ ()

Шаблоны классов только в заголовках.

invy ★★★★★ ()
Ответ на: комментарий от Pavval

Препод об этом мог и не рассказывать. Легко представить себе такую ситуацию, что препод на лекции говорит только по верхам, о концептуальных вещах. Для семинаров дает главы книг на прочтение и задания. Не осилил задание - незачет домашки. Много несделанной домашки - недопуск к зачету/экзамену. И это правильно, ибо заставляет мозг студента работать, а не все разжеванное переваривать.

seiken ★★★★★ ()
// sorts.cpp
template <typename T>
T* Sorts<T>::Sorting(T* mas, int size)
{
   // ...
}
template <typename T>
void Sorts<T>::printArray(const T* arr, int count)
{
   // ...
}
// explicit instantiation
template class Sorts<char>;
template class Sorts<int>;
template class Sorts<float>;
template class Sorts<double>;

Но подход идиотский.

iliyap ★★★★★ ()
Ответ на: комментарий от Pavval

при чем тут ходил или не ходил… Я же говорю, препод может сказать, читайте Страуструпа глава 1,2,3 и вот задание. Сроку неделя. А Страуструп непонятен, или задание предполагает какой-то тонкости, о которой в тех главах не рассказано. Какой-то один ботан догадался хрен знает откуда (может папа помог), как задание сделать, и на него препод ссылается, типа, вот видите, человек сделал (типа, а вы не сделали, потому что дураки).

seiken ★★★★★ ()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от seiken

«может сказать»?

Вот и я про это. Ты ни фига не учился, а теперь теоретизируешь что там было пока тебя не было на парах.

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

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

если препод неадекватен, то при чем тут дворники? Может быть преподу лучше в дворники?

seiken ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей