| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > требуются ваши телепатические способности %) |
| Автор: boostcoder 29.5.2012, 20:40 | ||||||
| все те же "бараны"..сериализация... код:
http://liveworkspace.org/code/1c4390aba0b4c19fadbcbb1379eeefe6 компилится и работает. но точно такой же код, в составе проекта выдает такие ошибки:
содержимое файла enum_cast.hpp:
подскажите, чего оно от меня кочет? битый час выносит мне моцг спасибо. Добавлено @ 20:50 да, в проекте эти функции зовутся enum_cast_to и enum_cast_from это в воспроизводящем примере я их укоротил. |
| Автор: hawk3500 29.5.2012, 22:05 |
| Как я понимаю, ты пытаешься вызвать функцию, объявление которой компилятор нашел, а определение нет. Может, в определении у тебя имя функции с опечаткой? |
| Автор: boostcoder 29.5.2012, 22:15 |
это же шаблонные функции. у них декларация и реализация в одном "флаконе" |
| Автор: hawk3500 29.5.2012, 22:46 |
| А можно увидеть как в проекте вы вызываете enum_cast_from ? Добавлено через 3 минуты и 8 секунд как она объявлется в том файле где используется? |
| Автор: boostcoder 29.5.2012, 23:22 |
код в топике, полностью идентичен тому что в проекте за исключением того, что в проекте помимо функции enum_test<>() еще куча других функций для других тестов. Добавлено через 1 минуту и 8 секунд кто "она" ? функция enum_cast_from? она в другом файле декларирована. текст того файла я так же привел в топике. |
| Автор: hawk3500 29.5.2012, 23:39 |
| я про вызов спрашивал именно к тому , что указывается ли явно при вызове к примеру enum_cast_to спецмфмкация шаблона. Добавлено через 1 минуту и 34 секунды Извеняюсь....не увидел сразу что на enum_test() тоже "ругаются"..... |
| Автор: boostcoder 30.5.2012, 10:41 |
| более никто не жив? |
| Автор: Static 30.5.2012, 11:12 |
| Прошу прощения за возможную глупость - но Я правильно понял, что объявление шаблонной функции и ее реализация (в проекте) находятся в разных файлах? Поддерживает ли Ваш компилятор такое? ЕМНИП, некоторые так не умели. |
| Автор: volatile 31.5.2012, 01:54 | ||||||
boostcoder, Это к первоначальному вопросу не отностися, но в коде есть грубая ошибка.
При чтении из ia, по адресу переменной енум, будет записан int. Фактически запишется 4 байте (int) на место где находится один байт (enum2: char). Код затирает соседние ячейки! Этот код правда на С++03 вообще не скомпилится, поэтому можно сказать что реально ошибка будет только на 2011. Этот код видимо из реального С++03 проекта, и если подходить строго, то и здесь не все чисто. Стандарт С++03 не оговаривет что енум будет обязательно длиной int
Так что, записывать по адресу енума, инт - формально это и в С++03 грубая ошибка. (хотя реально код в С++03, вероятно, будет работать) |
| Автор: boostcoder 31.5.2012, 09:50 | ||||
да, ты прав. я на это напоролся, когда победил сабжевую ошибку и дописал код сравнения результата десериализации с исходным значением. собственно конечный код:
https://github.com/niXman/yas/blob/master/tests/base/enum.hpp этого я тоже не знал. но так же, мне неизвестен компилятор где бы это было не так спасибо. |
| Автор: borisbn 31.5.2012, 10:40 | ||
Дебилдер. Там по-умолчанию енумы 1 байт. Поэтому если мне требуется, чтобы енум гулял по сети, записывался в файл и т.п. (т.е. чтобы его размер был гарантированно 4 байта вне зависимости от настроек) то я добавляю в конец списка 0x7FFFFFFF
хотел подсказать, что за такую помощь неплохо было бы volatile поблагодарить плюсиком, но вижу, что опоздал))) |
| Автор: boostcoder 31.5.2012, 11:38 |
| жуть какая Добавлено через 9 минут и 10 секунд да, для YAS не заявлена поддержка билдера) |
| Автор: volatile 31.5.2012, 23:39 |
| вот http://mateusz.loskot.net/2009/05/24/size-of-enumeration-type-in-c/ предлагается использовать спец. шаблон для обхода неопределенности с типом енума в с++03. (с первого взгляда, довольно юзабельно)... |