2014-10-12 2 views
1

Я использую следующий шаблон для кодирования значений без знака полукокса:Unsigned Char Шаблон Значение Переполнение

template <unsigned char val> 
struct Cell { 
    enum { value = val }; 

    using add = Cell<val + 1>; 
    using sub = Cell<val - 1>; 
}; 

Я ожидал sub вести себя как стандартный unsigned char переменной относительно переполнения:

unsigned char x = 0; 
x - 1; // 255 

Но вместо Я получаю ошибку компилятора в Clang:

using cell = Cell<0>; 
cell::sub::value; // Error here. 


Non-type template argument evaluates to -1, which cannot be narrowed to type 'unsigned char' 

I s переполнение обрабатывается по-разному в контексте шаблонов?

ответ

2

val - 1 является int на вашей платформе, из-за обычных арифметических преобразований. Не существует смысла для параметра шаблона типа unsigned char, которому должен быть задан аргумент int.

Просто убедитесь, что ваш аргумент шаблона имеет нужный тип: (. С использованием unsigned int буквенными означает, что обычные преобразования производят unsigned int, который хорошо определен сужение семантики)

using sub = Cell<static_cast<unsigned char>(val - 1U)>; 
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^ 

+0

Спасибо для указания меня в правильном направлении и предоставления решения. Вот статья, объясняющая интегральную рекламу C++ чуть более подробно: http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_promotion –

+1

@KerrekSB А, правильно. 'unsigned int 'также возможен. – dyp

+0

* «Не существует разумного значения для параметра шаблона типа unsigned char, которому должен быть задан аргумент int». * Я думаю, что это возможно, это просто не может быть сужающим преобразованием. I.e., 'val-1' могут быть преобразованы в' unsigned char' до тех пор, пока 'val> 0'. – dyp

Смежные вопросы