У меня есть ошибки компиляции:потеря константных летучих классификаторов
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) };
};
Обновление: Нашел! Посмотрите внимательно на приведенный выше шаблон и посмотрите, можете ли вы его увидеть.
Функция вашего подкачки не работает правильно, если 'T' подписан. Кроме того, нет веских оснований считать '_val' ссылкой. –
+1 для "обычно google дает мне ответы"! –
@BenVoigt Это по дизайну все параметры шаблона вынуждены без знака. – Twifty