![]() |
|
Модераторы: bsa |
![]()
|
|
| Riddik |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Туплю после бессонной ночи наверное.
Есть ф-ия, принимающая указатель на ф-ию:
Собственно, ф-ия:
Вызов первой ф-ии:
Компилятор ругается, что не может конвертировать из void(void) в void (_cdecl *)(void). Что такое? |
||||||
|
|||||||
| Andrew121 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 21.6.2009 Репутация: 1 Всего: 1 |
|
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Ругается точно так же.
Этот проект я делаю на старом компиляторе vc 6.0, может в этом дело? |
|||
|
||||
| Andrew121 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 21.6.2009 Репутация: 1 Всего: 1 |
Мдя...тот компилятор ваще не понятно какого стандарта придерживается Добавлено через 47 секунд Ругается он на "calling conversion". Посмотри как для него это нужно делать... Добавлено через 1 минуту и 25 секунд А почему такой компилятор используешь? |
|||
|
||||
| Andrew121 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 21.6.2009 Репутация: 1 Всего: 1 |
Еще так попробуй:
|
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
На все варианты та же ругань.
Этот компилятор использую по причине того, что давно начал на нём делать и всё устраивало на 100%, на новый переводить очень затратно по причине разной реализации STL, а именно vector, который активно используется. В новой и старой STL по-разному реализованы добавление и удаление элементов в вектор, в новой добавление или удаление элемента влечёт полное переписование всего вектора в другую область памяти, что делает некоторые указатели на его элементы недействительными, а главное, тратит значительно больше ресурсов процессора, а скорость выполнения критична для проекта. Все эти мои выводы вполне могут оказаться бредом, поскольку изучением STL я нормально ещё не занимался, всё на ощупь. |
|||
|
||||
| Andrew121 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 21.6.2009 Репутация: 1 Всего: 1 |
Похоже что так оно и есть.... Абсолютная истина! Но все вектора так и работают! Что-то ты заблуждаешься... В теории, если в вектор добавлен элемент, то прежние итераторы, 50 на 50, будут не валидны! При удалении же, где-то 30 на 70. И не изучай программирование на этом компиляторе. Он очень плохо соответствует стандарту! Потом если пересядишь на современный компилятор, окажется что кроме теории ты ничего не знаешь!!!! Вот тогда ты осознаешь что такое ж*** |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
На современном компиляторе я сижу тоже.
Насчёт vector в старой реализации не уверенн, но многочисленные тесты говорят пока в пользу моих выводов. |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Term что такое? тип? или имя функции? в С++ обязательно указывать тип, в отличии от С.
|
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Конечно указывал. Term - функция-член.
|
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Чтоб не было путаницы:
Помогите, почему не хочет работать, сам не могу справиться. Вот полный текст ошибки: "error C2664: 'Term' : cannot convert parametr 2 from 'void (void)' to 'void (_cdecl *)(void)' None of the functions with this name in scope match the target type" |
|||
|
||||
| jonie |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
Обновление-то ставили?) замените это:
на
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||
|
|||||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Нет, что за обновление и где его взять?
Для моего VC 6 и с void _cdecl Nismo() {...} всё та же песня. |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Хм... просто как пример у jonie и меня компилится... в чём же может быть ошибка...?
Класс c функцией-членом определён в одном файле, а вызывается она в другом... |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Я не совсем точно привёл мой код...
В общем, проблема возникает, когда в качестве параметра ф-ии передаётся адрес ф-ии - члена класса, если свободной ф-ии - то нет проблем. Можно как-нибудь разрешить это? |
|||
|
||||
| hsilgos |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 26.4.2009 Репутация: 1 Всего: 2 |
Естественно! Указатель на метод класса отличается от указателя на свободную функцию!
Добавлено @ 19:56 Вообще, чтобы вызвать нестатический метод класса, нужен указатель на объект и указатель на функцию. И вызывать надо вот таким образом:
Добавлено через 9 минут и 56 секунд
Работать, опираясь на это - очень большая ошибка. Рано или поздно где-то в коде это аукнется. У вас на 6-ке, возможно, это прокатывало, потому что добавляли/удаляли элементов не много, если же попробовать на больших объемах, думаю, прийдет кранты. Да и кто мешает написать свой аллокатор и распределять память по-своему? Тогда ваши указатели останутся валидными всегда. Это сообщение отредактировал(а) hsilgos - 27.6.2009, 19:57 |
||||||||
|
|||||||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
в vc шаманские auto_prt-ы, их можно пихать в контейнеры 8)
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
ололололо O_o
как такое может прийти в голову?? (стало интересно) |
|||
|
||||
| hsilgos |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 26.4.2009 Репутация: 1 Всего: 2 |
Вот реализация конструктора копирования в MSVC-шном (2005) STL-е.
Всё по стандарту, пихать в контейнеры нельзя. |
||||
|
|||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
hsilgos, спасибо!
Я до этого ещё не дошёл, немножко вперёд поезда забегаю. А если такую функции надо передавать функции-члены разных классов, то нужно использовать указатель на базовый класс, верно? |
|||
|
||||
| hsilgos |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 26.4.2009 Репутация: 1 Всего: 2 |
Если использовать шаблон, то можно вообще любые классы. Главное, чтоб у метода совпадала сигнатура. А что касается базового класса, я вот тут, чесно говоря, не знаю, безопасно ли это... т.е:
Хотя в wxWidgets сделано по подобному принципу, и вроде как на всех платформах работает... Если же метод void f() будет виртуальным и объявлен в базовом классе А, то таких неопределенностей не будет. |
||||
|
|||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
В общем, в сторону указатель на ф-ию, вместо него указатель на базовый класс:
И всё работает. Спасибо за терпение. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |