Недавно я начал изучать классы и перегрузку операторов в C++ и написал следующий класс Bignum, чтобы попрактиковаться. Ссылка: http://pastebin.com/cQNwRChx. Это не финальная версия, например там нет обработки исключений и возможно она не такая эффективная, поэтому хочу уточнить некоторые вопросы:
- Этот код успешно скомпилирован в MSVS 2010, но GNU C++ 4.4.1 говорит, что 'fft' не был объявлен в этой области в строке 465.
- Я использую быстрое преобразование Фурье для умножения чисел, когда результат огромен. Из-за очень медленных стандартных комплексных чисел я написал свою собственную реализацию. На мой взгляд, эти комплексные числа должны быть скрыты, потому что это часть реализации Lint. Поэтому я объявляю его частным вложенным классом Lint и объявляю fft другом Lint. Почему это не работает в GNU?
- Отладчик MSVS показывает, что константа ONE не является статической константой. Он определен ниже, после определения Lint.
- Я бы хотел использовать в выражениях классы с int, unsigned int и т.д., и текущая версия работает нормально, но также я хочу иметь возможность писать что-то вроде этого:
if (a) ...
, где a — это Lint. Но если я определяю неявное преобразование в bool и пишуa+b
, где a — это int, а b — Lint, возникает двусмысленность. Как я могу решить эту проблему?
УПД. Есть простой псевдокод без лишних функций и определений: http://pastebin.com/rauKQjtH.
explicit operator bool() const
, если C++11 разрешен, в противном случае гуглите Safe-Bool-Idiom. Кроме того, вам может пригодиться моя библиотека df.operators (опять же, если C++11 вариант, в противном случае проверьте Boost.Operators) - person Daniel Frey   schedule 13.04.2013