http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55737
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-12-19
15:54:22 UTC ---
(Your testcase would be a lot easier to read without all those comments inside
the conditional expression, I think it's safe to assume everyone here knows
which is the false branch of a conditional expression!)
A conditional expression is not a "static if" so templates in both branches of
the conditional expression are instantiated, and instantiating DivByX<0> fails.
You could work around this by preventing instantiation of the problem case, the
simplest way is to specialize the template:
template <>
struct DivByX<0>
{
enum
{
value1 = X,
value2 = 0;
};
};
Now it doesn't matter if the DivByX<0> case is instantiated because it doesn't
divide by zero.