const volatile限定符丢失
loss of const volatile qualifiers
我有一个编译错误:
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) };
};
更新:找到了!仔细看上面的模板,看看你是否也能看到它。
如何实例化模板。您的实例化endian_swap
使用类型T
,并向其传递一个unsigned
short
。除非T
是unsigned short
,否则您需要转换以及转换的结果是临时的,它不能绑定到非常量引用。
你没有提供SSCCE,所以很难说。但是错误您发布的消息指的是呼叫unsigned long unicode::endian_swap<T>::operator ()(T &);
为unsigned long
实例化endian_swap
(其中在这种情况下,通过unsigned short
需要临时),或您发布的代码不是引发错误的代码。