2013-07-19 2 views
10

У меня есть ошибки компиляции:потеря константных летучих классификаторов

error C3848: expression having type 'const unicode::endian_swap<T>' 
      would lose some const-volatile qualifiers in order to call 
      'unsigned long unicode::endian_swap<T>::operator()(T &)' 

описание этой ошибки, Here, на самом деле не объяснить, что происходит.

Я не могу воспроизвести ошибку в меньшем экземпляре, но я могу показать базовый макет моего класса.

template < typename T > 
struct endian_swap 
{ 
    endian_swap (void) {} 
    T operator() (T& _val) const { return _val >> 8 | _val << 8; } 
}; 

template < typename T > 
struct test 
{ 
    endian_swap<T> _swap; 

    virtual void do_it () const 
    { 
     unsigned short n = 0x1234; 
     unsigned short * _dest = &n; 

     *_dest++ = _swap(n); // <-- Error is here 
    } 
}; 

Ошибка после добавления endian_swap в качестве участника. Фактический класс получен из std::codecvt и установлен в std::locale.

Может ли кто-нибудь дать лучшее объяснение ошибки, чем на сайте выше.

Edit: Фактический код:

template < typename T, size_t N = sizeof(T) > struct endian_swap 
{ 
    endian_swap (void) {}; 
    T operator() (const T _val) const { return _val }; 
}; 
template < typename T > struct endian_swap< T, 2 > 
{ 
    endian_swap (void) {} 
    T operator() (const T _val) const { return _val >> 8 | _val << 8; } 
}; 
template < typename T > struct endian_swap< T, 4 > 
{ 
    endian_swap (void) {}; 
    T operator() (const T _val) const { return (_val >> 24) | ((_val & 0x00ff0000) >> 8) | ((_val & 0x0000ff00) << 8) | (_val << 24) }; 
}; 

Обновление: Нашел! Посмотрите внимательно на приведенный выше шаблон и посмотрите, можете ли вы его увидеть.

+0

Функция вашего подкачки не работает правильно, если 'T' подписан. Кроме того, нет веских оснований считать '_val' ссылкой. –

+0

+1 для "обычно google дает мне ответы"! –

+0

@BenVoigt Это по дизайну все параметры шаблона вынуждены без знака. – Twifty

ответ

5

Как вы создаете шаблон. Ваш экземпляр endian_swap использует тип T, и вы передаете его unsigned short. Если T не является unsigned short, вам потребуется преобразование, а результаты преобразования являются временными, , которые не могут связываться с неконстантной ссылкой.

Вы не предоставляете SSCCE, поэтому трудно сказать. Но сообщение об ошибке проводки относится к вызову unsigned long unicode::endian_swap<T>::operator()(T &); либо endian_swap конкретизируются для unsigned long (в котором дела, передавая unsigned short потребуется временное), или код, который вы размещены не код, который вызвал ошибку.

+0

Фактический тип данных: 'std :: codecvt :: intern_type', который устанавливается как' unsigned short' при создании. – Twifty

+0

Дайте мне несколько советов, чтобы попробовать. Вытягиваю волосы над этим. :/ – Twifty

+0

Если это так, то диагностика компилятора безнадежно пропускает отметку. –

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