Потеря константных коэффициентов

У меня ошибка компиляции:

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 &)'

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

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

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.

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

Изменить: Фактический код:

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) };
};

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

Ответ 1

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

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