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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2012, 17:45   #1
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
Вопрос Ошибка при перегрузке шаблонов функций

Простой шаблон функций: используется для массивов элементов типов int, double, char. Понадобилось добавить такую же функцию для типа string, но там один тип не получится использовать и попробовал сделать перегрузку для шаблона.

Код:
#include <iostream>
#include <string>

using namespace std;

template <class T>
	int count(T* array, T number, int size)
	{
		int countN=0;
		for (int i = 0; i < size; ++i)
		{
			if (array[i]==number)
			{
				countN++;
			}
		}
	return countN;
	}

template <typename T, typename U>
	int count(T, U, int);

void main()
{
	int ia[]={1,5,3,3,6,7,3,8,9,8};
	double da[]={10.3,15.0,33.51,21.85,21.85,28.1,21.85,52.0,69.1,81.2};
	char ca[]={'a','s','d','a','r','f','d','a','s','f'};
	char *sa="hsadgfiwenm";
	string s="hsadgfiwenm";

	int isize=sizeof(ia)/sizeof(ia[0]);
	cout << "ia[]_____\n";
	cout << "3: " << count(ia,3,isize) << "\n\n";

	int dsize=sizeof(da)/sizeof(da[0]);
	cout << "da[]_____\n";
	cout << "21.85: " << count(da,21.85,dsize) << "\n\n";

	int csize=sizeof(ca)/sizeof(ca[0]);
	cout << "ca[]_____\n";
	cout << "a: " << count(ca,'a',csize) << "\n\n";

	int ssize=sizeof(sa)/sizeof(sa[0]);
	cout << "sa[]_____\n";
	cout << "a: " << count(sa,'a',ssize) << "\n\n";

	int ss=sizeof(s)/sizeof(s[0]);
	cout << "s_____\n";
	cout << "a: " << count(s,'a',ss) << "\n\n";

	system("pause");
}
На выделенной строке выскакивают такие ошибки:
Цитата:
[ILINK32 Error] Error: Unresolved external 'int count<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, int)' referenced from D:\RAD STUDIO\PROJECTS\ШАБЛОН COUNT\DEBUG\FILE1.OBJ
[ILINK32 Error] Error: Unable to perform link
Что это?!

Последний раз редактировалось Andersen1313; 19.07.2012 в 17:47.
Andersen1313 вне форума Ответить с цитированием
Старый 19.07.2012, 18:02   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Andersen1313
Цитата:
Что это?!
Код:
string s="hsadgfiwenm";

...

int ss=sizeof(s)/sizeof(s[0]);
cout << "s_____\n";
cout << "a: " << count(s,'a',ss) << "\n\n";
Цитата:
int ss=sizeof(s)/sizeof(s[0]);
бред.

Код:
char *sa="hsadgfiwenm";

...

int ssize=sizeof(sa)/sizeof(sa[0]);
cout << "sa[]_____\n";
cout << "a: " << count(sa,'a',ssize) << "\n\n";
Код:
int ssize=sizeof(sa)/sizeof(sa[0]);
тоже бред

Цитата:
Что это?!
нет определения шаблонной функции count, которая бы принимала первый элемент не_указатель
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; 19.07.2012 в 18:06.
pproger вне форума Ответить с цитированием
Старый 19.07.2012, 18:35   #3
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Я понимаю, что вы отвечаете на то, что заметили, но я задал вопрос совершенно по другой части кода. Да сознаюсь ступил скопировал куски кода не подумав.. Но все же вопрос о другом..

И вы уверены что ошибка какая мне выпала это означает? или вы опять ответили на свой вопрос?!

Предположим я исправил это, но мне это не помогла как я и ожидал.. Как мне исправить ошибку какая вылезла?!

В общем думал думал и решил сделать так:
1) Сначала стер перегруженную функцию какую я налепил;
2) Потом при вызове передал адрес первого символа из строки.

В итоге получилось вот что(вместе с исправлениями замечаний, которые мне написали выше):
Код:
#include <iostream>
#include <string.h>

using namespace std;

template <class T>
	int count(T* array, T number, int size)
	{
		int countN=0;
		for (int i = 0; i < size; ++i)
		{
			if (array[i]==number)
			{
				countN++;
			}
		}
	return countN;
	}

void main()
{
	int ia[]={1,5,3,3,6,7,3,8,9,8};
	double da[]={10.3,15.0,33.51,21.85,21.85,28.1,21.85,52.0,69.1,81.2};
	char ca[]={'a','s','d','a','r','f','d','a','s','f'};
	char *sa="hsadgfiwenm";
	string s="hsahgfiwhenm";

	int isize=sizeof(ia)/sizeof(ia[0]);
	cout << "ia[]_____\n";
	cout << "3: " << count(ia,3,isize) << "\n\n";

	int dsize=sizeof(da)/sizeof(da[0]);
	cout << "da[]_____\n";
	cout << "21.85: " << count(da,21.85,dsize) << "\n\n";

	int csize=sizeof(ca)/sizeof(ca[0]);
	cout << "ca[]_____\n";
	cout << "a: " << count(ca,'a',csize) << "\n\n";

	int ssize=strlen(sa);
	cout << "sa[]_____\n";
	cout << "a: " << count(sa,'a',ssize) << "\n\n";

	int ss=s.size();
	cout << "s_____\n";
	cout << "a: " << count(&s[0],'h',ss) << "\n\n";

	system("pause");
}
Вопрос: Корректен ли такой подход к решению?

Последний раз редактировалось Stilet; 19.07.2012 в 19:50.
Andersen1313 вне форума Ответить с цитированием
Старый 19.07.2012, 19:47   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от Andersen1313 Посмотреть сообщение
Я понимаю, что вы отвечаете на то, что заметили, но я задал вопрос совершенно по другой части кода. Да сознаюсь ступил скопировал куски кода не подумав.. Но все же вопрос о другом..

И вы уверены что ошибка какая мне выпала это означает? или вы опять ответили на свой вопрос?!
внимательней мой пост читай, я ответил на твой вопрос
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 вне форума Ответить с цитированием
Старый 19.07.2012, 19:50   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
cout << "a: " << count(&s[0],'h',ss) << "\n\n";
Цитата:
Вопрос: Корректен ли такой подход к решению?
не обязательно и зависит от реализации. я бы сказал, что нет.

Код:
cout << "a: " << count(s.c_str(),'h',s.length()) << "\n\n";
а вот так правильно
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 вне форума Ответить с цитированием
Старый 19.07.2012, 19:53   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Andersen1313 Посмотреть сообщение
Вопрос: Корректен ли такой подход к решению?
Нет. Не корректен.

Нет никакой гарантии, что элементы стринга будут лежать в непрерывном блоке памяти.




Кстати, ты спутал понятия.

Вот твоя задумка:

используется для массивов элементов типов int, double, char.

А на самом деле ты работаешь с указателями на элементы.

Теперь, тебе захотелось что бы твой шаблон начал работать ещё и с контейнерами STL.

Если бы ты действительно работал с массивами, тогда шаблон без всяких
дрязг был бы совместим с векторами и стрингами. А при минимальных движениях руки, смог бы работать и со всеми остальными контейнерами.

Могу предложить тебе такой вариант: работай с массивами. Работай с контейнерами. Не работай с указателями.
_Bers вне форума Ответить с цитированием
Старый 20.07.2012, 07:43   #7
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

pproger, спасибо!
Andersen1313 вне форума Ответить с цитированием
Старый 20.07.2012, 07:44   #8
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

А есть какой нибудь искусственный способ проверить такую ситуацию? как нибудь память разбить? заставить записаться строку в память кусками?
Andersen1313 вне форума Ответить с цитированием
Старый 20.07.2012, 09:40   #9
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

А как мне объявить перегруженную функцию для шаблона?:
Код:
template <class T>
	int count(T* array, T number, int size)
	{
		int countN=0;
		for (int i = 0; i < size; ++i)
		{
			if (array[i]==number)
			{
				countN++;
			}
		}
	return countN;
	}

template <class T, int size>
	int count(T (&array)[size],T number); //МОЯ ПОПЫТКА ОБЪЯВИТЬ ТАКУЮ ФУНКЦИЮ
Чтобы она вызывалась подобным вызовом:
Код:
...
int ia[]={1,5,3,3,6,7,3,8,9,8};
...
count(ia,3);
Т.е. без явной передачи в функцию размера массива, второе число это отыскиваемое число в массиве

P.S. то объявление какое я написал взял из Липпмана, но походу я что не допонял, потому что мне выпала та же ошибка, что и в первом сообщение в этой теме.

Последний раз редактировалось Andersen1313; 20.07.2012 в 09:43.
Andersen1313 вне форума Ответить с цитированием
Старый 20.07.2012, 09:56   #10
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Andersen1313 Посмотреть сообщение
А как мне объявить перегруженную функцию для шаблона?:
Код:
template <class T>
	int count(T* array, T number, int size)
	{
		int countN=0;
		for (int i = 0; i < size; ++i)
		{
			if (array[i]==number)
			{
				countN++;
			}
		}
	return countN;
	}

template <class T, int size>
	int count(T (&array)[size],T number); //МОЯ ПОПЫТКА ОБЪЯВИТЬ ТАКУЮ ФУНКЦИЮ
Чтобы она вызывалась подобным вызовом:
Код:
...
int ia[]={1,5,3,3,6,7,3,8,9,8};
...
count(ia,3);
Т.е. без явной передачи в функцию размера массива, второе число это отыскиваемое число в массиве

P.S. то объявление какое я написал взял из Липпмана, но походу я что не допонял, потому что мне выпала та же ошибка, что и в первом сообщение в этой теме.
Я совершил глупейшую ошибку, как и в первый раз в этой теме, я почему то решил, что для шаблона достаточно только объявить перегруженную функцию, а определять не надо.. Даже не знаю почему я так подумал..
Andersen1313 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при перегрузке << и >> DartDayring Visual C++ 8 07.12.2020 13:42
программа в виде шаблонов функций julia9311 Общие вопросы C/C++ 2 01.07.2012 23:25
C++ Использование функций-шаблонов. killeraleksana Помощь студентам 0 10.05.2012 22:44
Ошибка при перегрузке операторов. bill Общие вопросы C/C++ 1 26.01.2012 21:17
Типы аргументов при перегрузке функций Arkuz Общие вопросы C/C++ 4 24.02.2009 01:16