![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
georain |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
В последней строке ошибка преобразования. Вопрос почему, или как мне зарегистрировать foo как callback:
Ведь метод foo является методом как базового так и производного класса. |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а текст ошибки зачем скрываете ? это не константный указатель, а указатель на константу.. и соответсвенно будет вызывать конфликт в call(..);
Это сообщение отредактировал(а) mes - 14.10.2010, 08:18 |
|||
|
||||
georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вы совершенно правы, спасибо большое. Но моя проблема лишь отодвинулась немного дальше. Требуется вызвать шаблонный метод наподобие этого:
Метод объявленный непосредственно в классе Derived вызывается без проблем, а метод из базового класса вызываться не хочет.
Для этого я и пытался сделать приведение, но и этого сделать не удалось:
|
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Добавлено через 2 минуты и 23 секунды это в качестве изучения или решаете какую то практическую задачу ? если второе то велосипеды уже изобретены ![]() например boost::function, он же (на совр компиляторах) std::(tr1::)function; |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Спасибо за вариант, но требуется статическая передача указателя для того чтобы компилятор мог сделать inline.
В общем случае
И блин, у меня уже целый год пол проекта на этом работает, а тут бац, метод из базового класса передать не могу. В принципе решается то просто, добавлением в нужный класс метода с вызовом метода из базового, но это же ерунда. Занимаюсь распределенными системами и асинхронным выполнением. Это сообщение отредактировал(а) georain - 15.10.2010, 01:20 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() Добавлено через 2 минуты и 6 секунд заинлайненая фунция, эта такая "функция" которую не возможно вызвать по адресу, через указатель ![]() ничего противоречивого не замечаете ? ![]() |
|||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
[offtop]
variadic templates? ![]() микрософтстудия? у кого есть такой компилятор, скажите пожалуйста, что говорит на такие выражения:
в gcc еще не реализовано :( спасибо. [/offtop] Добавлено @ 08:29 а кто сказал что это функция? сказали что это функция, в кавычках ![]() Это сообщение отредактировал(а) boostcoder - 15.10.2010, 08:30 |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
поэтому я и взял слово функция в кавычки ![]()
не понимая цели, трудно предложить варианты. которые Вас устроят ![]()
|
||||||
|
|||||||
georain |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Вариативные шаблоны реализованы, gcc c++0x. Gcc 4.4 на приведенный код пишет (кстати три точки надо в другом месте ставить):
mes, ещё раз спасибо за работающий фрагмент. Сейчас у меня цель понять и разобраться, почему не работают некоторые выражения:
и
Например здесь происходит преобразование указателя:
и так как это выражение корректно, то это наводит меня на мысль, что тип метода foo - void(Base::*)(void), и никак не void(Derived::*)(void), хотя Derived все-же содержит в себе этот метод. В этом видимо суть проблемы. То что выражение &Derived::foo возвращает указатель с типом void(Base::*)(void)... |
||||||||
|
|||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Так ну вроде бы начинает доходить, хотя я это изначально как-то интуитивно воспринимал, поэтому и хотел сделать преобразование
Но почему теперь эту константу в параметр шаблона то не получается загнать. Добавлено через 21 секунду А что интересно? Добавлено через 1 минуту и 31 секунду Если микрософтстудия, то они там ещё не скоро появятся. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
Не так давно тут был небольшой срач, так вот, по результатм: функция, передаваемая по указателю, вполне может инлайниться в код, если во время компиляции не обнаруживается, что адрес указателя может измениться в рантайме - по сути это условие использования тех же шаблонов; выяснилось также, что такое поведение зависит от компилятора и его версии.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
потому что это const, а не constexpr (константное выражение) Добавлено @ 09:14 да.. но передача адреса фанкции в шаблон не увеличивает шансы на ее заинлайненость - именно об этом и шла речь выше.. т.е. смысла строить шаблон вместо того чтоб вызвать напрямую, нет, если только там не делается особых проверок .. но тогда варианты с передачей функции как параметра шаблона, так и параметра шаблонной функции равнозначны, при условии передачи ее как констатного выражения.. так как второй вариант может принимать и указатели .. Это сообщение отредактировал(а) mes - 15.10.2010, 09:18 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |