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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 15:50   #1
opensuse2008
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 12
По умолчанию C++ Специализация шаблона

Итак
Текст задания:
Написать специализацию шаблона функции поиска для массива строк

То что я сделал:
#include<iostream>
#include<cmath>
#include<cstring>

using namespace std;

template <class A, class B> int find(A* p, int N, A pp)
{
int i, g=-1;
for(i=0; i<N; i++)
if(B::less(p[i], pp))
g=i;

return g;
}

template <class A, class B> int find(A p, int N, A pp)
{
int i, g=-1;
for(i=0; i<N; i++)
if(B::less(p[i], pp))
g=i;

return g;
}

template<class A> class C
{
public:
static bool less(A a, A b)
{
return a==b;
}
};

void main()
{
char* A[]={"Time", "is", "money"};
int a=find<char, C<char> > (A[1], 3, "is");
}

Код ошибки:
--------------------Configuration: makaka - Win32 Debug--------------------
Compiling...
f.cpp
C:\makaka\f.cpp(39) : error C2665: 'find' : none of the 2 overloads can convert parameter 3 from type 'char [3]'
Error executing cl.exe.

f.obj - 1 error(s), 0 warning(s)

Не могу понять что требуется исправить
opensuse2008 вне форума Ответить с цитированием
Старый 07.06.2009, 16:19   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

так покатит.
Код:
#include<iostream>

using namespace std;

template<typename T> 
class pred
{
public:
	bool operator()(T *a, T *b) {
		return strcmp(a,b);
	}
};

template<typename IterFirst, typename IterLast,typename T, typename _pred>
int find(IterFirst begin, IterLast end, T is_find , _pred pr){
	int number = 0;
	for(; begin != end; ++begin){
		if(!pr(*begin,is_find))
			return number;
		++number;
	}
	return -1;
}

int main()
{
	char* a[]	= { "Time", "is", "money"};
	char time[]       =  "Time";
	char is[]	= "is";
	char money[]     = "money";

	cout << find(a, a + 3,money,pred<char>()) << endl;
	cout << find(a, a + 3,time,pred<char>()) << endl;
	cout << find(a, a + 3,is,pred<char>()) << endl;

	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.06.2009, 16:53   #3
opensuse2008
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 12
По умолчанию Спасибо тебе

Спасибо тебе буквально 10 часов сидел думал что сделать и вот ты пришел мне на помощь =)
завтра благодаря тебе может получу автомат =)
opensuse2008 вне форума Ответить с цитированием
Старый 07.06.2009, 17:04   #4
opensuse2008
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 12
По умолчанию Можно еще вопрос

Что такое typename
opensuse2008 вне форума Ответить с цитированием
Старый 07.06.2009, 17:14   #5
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Ключевое слово typename задает так называемый параметр типа.

В силу исторических причин для определения параметра типа разрешается применение вместо typename ключевого слова class. Ключевое слово typename в ходе эволюции языка C++ появилось относительно недавно, а до этого единственным способом задания параметра типа было ключевое слово class. Применение class для определения параметра типа корректно и сегодня.

в общем это
Код:
template<typename T>
равносильно этому
Код:
template<class T>
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.06.2009, 17:18   #6
opensuse2008
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 12
По умолчанию Спасибо

И не знаю что сказать теперь добавлю закладку а то на 10 форумах создал тему 0 внимания и только на этом ответили мне =)
opensuse2008 вне форума Ответить с цитированием
Старый 07.06.2009, 17:45   #7
opensuse2008
Пользователь
 
Регистрация: 07.06.2009
Сообщений: 12
По умолчанию

извини что пришлось так испоганить твой код у нас просто преподаватель такой =)
#include<iostream>

using namespace std;

template<typename T>
class pred
{
public:
bool operator()(T *a, T *b) {
return strcmp(a,b);
}
};

template<typename first, typename T, typename _pred>

int find(first elem, int max, T xz , _pred pr){

for(int i=0; i<max; i++){
if(!pr(elem[i],xz))
return i;
}
return -1;
}

void main()
{
char* a[]={"Time", "is", "money"};
char money[] = "money";
int index=find(a, 3,money,pred<char>());
if(index!=-1)
cout<<"Index elementa raven "<<index;
else
cout<<"Takoe slovvo ne naydeno";
}
opensuse2008 вне форума Ответить с цитированием
Старый 07.06.2009, 18:00   #8
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

для полного счастья нужно так доделать
Код:
#include <iostream>

#include<iostream>

using namespace std;

template<typename T> 
class pred
{
public:
	bool operator()(T a, T b) {
		return a != b;
	}
};

//Специализация шаблона
template<> 
class pred<char>
{
public:
	bool operator()(char *a, char *b) {
		return strcmp(a,b);
	}
};


template<typename first, typename T, typename _pred>

int find(first elem, int max, T xz , _pred pr){

	for(int i = 0; i < max; ++i){
		if(!pr(elem[i],xz))
			return i;
	}
	return -1;
}

void main()
{
	char* a[]= {"Time", "is", "money"};
	char money[] = "money";

	int index=find(a, 3,money,pred<char>());

	if(index!=-1)
		cout<<"Index elementa raven "<<index << '\n';
	else
		cout<<"Takoe slovvo ne naydeno\n";

	int arr[4] = {1,2,3,4};
	cout << find(arr,4, 2,pred<int>()) << '\n';
}
ЗЫ. тегом CODE пользуйся (значок #)
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение макросов из закрытого шаблона viter.alex Microsoft Office Word 0 30.01.2009 12:16
Копирование файла-шаблона Siver Microsoft Office Excel 3 26.12.2008 04:28
можно ли распознать картинку при помощи шаблона? DoktorX Общие вопросы Delphi 4 17.11.2006 07:13