| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > непонятка с конструкторами и указателями на ф-ии |
| Автор: Alek86 25.2.2008, 11:43 | ||
есть код
строка // 1 нормально компилится на строку //2 ругается: error C2512: 'Functor' : no appropriate default constructor available понимаю, что прикол тут из легких, но не вижу. может, кто объяснит? |
| Автор: jorikdima 25.2.2008, 12:04 |
| удалил |
| Автор: Alek86 25.2.2008, 12:11 | ||
создать временный объект типа Functorб передавая ему в качестве аргумента указатель на ф-ю ЗЫ. Кстати, ведь неважно, что я хочу сделать, вопрос же не "а почему оно не так работает"
должен? аргументируй |
| Автор: Fazil6 25.2.2008, 12:28 | ||||
| думаю, что дело в том, что компилятор не может такое выражение правильно разобрать (то, что ты имеешь в виду). попробуй вот так
Добавлено через 2 минуты и 25 секунд
ведь вызов конструктора - это не создание объекта, а инициализация объекта |
| Автор: Alek86 25.2.2008, 12:37 | ||||||||
помогло, спасибо
онлайн компилятор (других не имею) написал то же самое:
то есть эта "фича" согласована со Стандартом?
имхо, неверно
тут создается временный объект и сразу умирает |
| Автор: Daevaorn 25.2.2008, 12:38 | ||
хороший перл |
| Автор: Alek86 25.2.2008, 12:42 |
не перл, если имелось в виду невыделение памяти ведь new вызывает конструктор для уже выделенной памяти просто в стеке вместо new память выделяет среда выполнения Добавлено через 2 минуты и 51 секунду кстати вопрос еще в силе, хоть и чуток изменен это "Стандартное" поведение компилятора? |
| Автор: Daevaorn 25.2.2008, 12:45 | ||
для тебя "создание объекта" и "выделенение памяти" одно и тоже? |
| Автор: Alek86 25.2.2008, 12:50 |
| для меня "создание объекта" делится на "выделение памяти" и "инициализацию" читай внимательней или это третий перл? тогда уж потрудись объяснить как На Самом Деле, когда из под стола вылезешь |
| Автор: Mayk 25.2.2008, 12:58 | ||||
Судя по всему да. Можно же делать int a( int (x) ); вот и тут похоже то же самое. Тем более что если внести прототип ф-ции в main() то ошибка уже
|
| Автор: Alek86 25.2.2008, 13:01 | ||
а при чем тут int a( int (x) ) ? наоборот, тут МОЖНО вызвать int(x) (создание временного объекта) в моем же случае вызвать не получается Добавлено через 1 минуту и 10 секунд кстати
спокойно сьедает и не давится |
| Автор: Mayk 25.2.2008, 13:03 | ||
вот так компилятор тоже понимает что //2 ни разу не объявляет переменную под названием func Добавлено @ 13:05 Какой вызов? О чем ты? Нет там никакого вызова акромя неявного вызова конструктора по умолчания. Там определятся переменная func с типом Functor. И компилятор не может найти дефолтовый конструктор. О чем и сообщает. А у int(x) с конструированием по умолчанию проблем нет. В отличие от Functor'а. |
| Автор: Alek86 25.2.2008, 13:06 |
| хм если есть переменная func типа Func, разве не должен компилятор (используя поиск-не-помню-кого) найти конструктор, который принимает переменную типа Func и заюзать его? |
| Автор: Fazil6 25.2.2008, 13:06 | ||||||
вообще стандарт - сборник перлов. Создание объекта - выделение памяти + вызов конструктора. пробуем выполнить вот такую программу и многое становится ясно
По сути вопроса смотрим стандарт пункт 6.8 Ambiguity resolution Functor(func); // 2 - это тоже самое что и Functor func ; |
| Автор: Alek86 25.2.2008, 13:06 | ||
я про ситуацию
|
| Автор: Mayk 25.2.2008, 13:09 | ||
Если что-то выглядит как опредление это определение. Functor (func) выглядит как определение. Следовательно... |
| Автор: Alek86 25.2.2008, 13:13 |
| ясно, спасибо, вопрос закрыт |