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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2012, 00:13   #1
cyberpunks01
Новичок
Джуниор
 
Регистрация: 06.06.2012
Сообщений: 3
По умолчанию Вопрос про шаблоны ("нет соответствующей функции для вызова")

Обращаюсь к знатокам шаблонов. Подскажите, пожалуйста, почему не компилится код:
$ cat 1.cc
Код:
template<typename T>
class event {
public:
	class const_iterator {
	};
};
template<typename T>
inline bool a1abcd(typename event<T>::const_iterator i1, typename event<T>::const_iterator i2) {
	return false;
}

class MyClass {};

static void A() {
	event<MyClass>::const_iterator i;
	a1abcd(i, i);
}
$ g++ -c 1.cc
1.cc: In function ‘void A()’:
1.cc:16: ошибка: нет соответствующей функции для вызова ‘a1abcd(event<MyClass>::const_itera tor&, event<MyClass>::const_iterator&)’

Я уже весь мозг сломал, пытаясь понять в чём причина и как быть.
cyberpunks01 вне форума Ответить с цитированием
Старый 06.06.2012, 02:36   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2cyberpunks01
если хочешь, чтобы работал твой код, ты должен вызывать свою шаблонную функцию так:
Код:
a1abcd<MyClass>(i, i);
ибо параметры шаблонной функции компилятор может определить только по передаваемым ей аргументам. но обычно делают как то так:
Код:
template<typename T>
class event {
public:
	class const_iterator {
	public:
		typedef T MyType;
	};
};

template <typename Iter>
bool a1abcd(Iter i1, Iter i2) {
	return false;
}

class MyClass { };

void A() {
	event<MyClass>::const_iterator i;
	a1abcd(i, i);
}
и если нужно, до шаблонного параметра всегда можно добраться из функции a1abcd:
Код:
typename Iter::MyType t;
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 вне форума Ответить с цитированием
Старый 06.06.2012, 03:46   #3
cyberpunks01
Новичок
Джуниор
 
Регистрация: 06.06.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2cyberpunks01
если хочешь, чтобы работал твой код, ты должен вызывать свою шаблонную функцию так:
Да, так оно работает. Но дело в том, что a1abcd - это, на самом деле, operator==. И вызывать его таким образом было бы ну очень неудобно. Значит я правильно понял, что в таком случае компилятор никак не может вывести тип шаблона и operator== (вместо которого в приведённом тестовом коде a1abcd) надо делать обязательно членом?
cyberpunks01 вне форума Ответить с цитированием
Старый 06.06.2012, 11:37   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2cyberpunks01
Ну я же показал, как можно делать.

и да, раз это у тебя operator==, зачем делать его отдельной функцией? сделай функцией-членом
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; 06.06.2012 в 12:32.
pproger вне форума Ответить с цитированием
Старый 07.06.2012, 01:17   #5
cyberpunks01
Новичок
Джуниор
 
Регистрация: 06.06.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2cyberpunks01
и да, раз это у тебя operator==, зачем делать его отдельной функцией? сделай функцией-членом
Я рассуждал как раз наоборот - раз это operator== (бинарный) зачем делать его членом? надо делать отдельной функцией.
У меня в этом проекте все бинарные операторы сделаны friend-функциями. И если не идти на сделку с совестью, то надо их все переделывать на функции-члены получается (т.к. рассуждение "если класс вложенный, то бинарные операторы надо делать членами, а если нет - то внешними функциями" - это бред какой-то)

Во всяком случае спасибо, я понял в чём заключается проблема, хотя и непонятно как её решить безболезненно.
cyberpunks01 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
если >30 тогда "да" иначе "нет"... DBgrid Daur БД в Delphi 4 30.05.2010 16:54
Вопрос-прикол. Почему в голосованиях нет "минусов" grenles Свободное общение 2 19.03.2010 23:51
Нет в русском языке "ложит", есть - "кладет". mihali4 Свободное общение 25 01.04.2008 11:19