Я не могу понять, почему следующий код не работает. компилятор (gcc), похоже, создает экземпляры обоих методов, и, очевидно, целое число либо со знаком, либо без знака, поэтому один всегда терпит неудачу. Я хотя enable_if был здесь, чтобы избежать этого.
В: почему возникает ошибка компиляции и как ее избежать?
using namespace boost; // or std as you want
template<typename T>
struct test {
// if signed
template< typename enable_if
< is_signed<T>
, int
>:: type = 0
>
test &operator<<=(int value)
{}
// if unsigned
template< typename enable_if
< is_unsigned<T>
, int
>:: type = 0
>
test &operator<<=(int value)
{}
};
void foo()
{
test<int> x;
x << 1; // COMPILE ERROR no type named 'type' in struct enable_if<unsigned> etc.
test<unsigned> y;
y << 1; // COMPILE ERROR no type named 'type' in struct enable_if<int> etc.
}