Twi*_*fty 10 c++ templates volatile
我有一个编译错误:
Run Code Online (Sandbox Code Playgroud)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
    }
};
Run Code Online (Sandbox Code Playgroud)
添加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) };
};
Run Code Online (Sandbox Code Playgroud)
更新:找到它!仔细查看上面的模板,看看你是否也能看到它.
你是如何实例化模板的?您endian_swap使用类型的实例化
 T,并传递它unsigned
short.除非T是unsigned short,否则您将需要转换,并且转换的结果是临时的,不能绑定到非const引用.
你没有提供SSCCE,所以很难说.不过,在提问的错误消息指的是一个电话unsigned long unicode::endian_swap<T>::operator ()(T &);要么
 endian_swap被实例化unsigned long(在这种情况下,通过一个unsigned short需要临时),或者您发布的代码是不是由此引发错误的代码.