Как мне избежать предупреждения о делении на ноль в этом коде шаблона?

У меня есть класс для арифметики с фиксированной точкой, основная часть которого:

template <typename I, I S>
struct fixed
{
    I value;

    fixed(I i) : value(i * S) {}

    template <typename J, J T> fixed(const fixed<J, T> &fx)
    {
        if (S % T == 0)
            value = fx.value * (S / T);
        else if (T % S == 0)
            value = fx.value / (T / S);
        else
            value = S * fx.value / T;
    }

    static_assert(S >= 1, "Fixed-point scales must be at least 1.");
};

В GCC 4.4.5 следующая строка кода:

fixed<int, 8> f = fixed<int, 2>(1);

Создает ошибку:

fixed.hpp: In constructor ‘fixed<I, S>::fixed(const fixed<J, T>&) [with J = int, J T =     2, I = int, I S = 8]’:
fixed.hpp:81: error: division by zero

Пока в коде есть деление на постоянный ноль - одно из T / S или S / T должно быть нулем для неравных масштабов - если S% T == 0 (и S не равно 0), тогда S / T не равно нулю. Кажется, что GCC выполняет достаточно оптимизацию, чтобы выяснить, что одна из моих веток гарантированно делится на ноль, но недостаточно оптимизации, чтобы определить, что эта ветка гарантированно не запускается.

Я могу выбросить #pragma GCC диагностика игнорирует "-Wdiv-by-zero" в файле, но это может скрыть реальные предупреждения.

What ' Как правильно разрешить эту ситуацию? (Или мой анализ полностью неверен и у меня действительно есть деление времени выполнения на ноль?)

8
задан 7 March 2011 в 09:15
поделиться