失去const挥发性限定词

时间:2013-07-19 14:46:51

标签: c++ templates volatile

我遇到编译错误:

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

有人可以比上面的网站更好地解释错误。

编辑:实际代码:

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 个答案:

答案 0 :(得分:5)

您如何实例化模板。你的实例化 endian_swap使用T类型,并将其传递给unsigned short。除非Tunsigned short,否则您需要 转换,转换结果是暂时的, 它不能绑定到非const引用。

你没有提供SSCCE,所以很难说。但错误 您发布的消息也指对unsigned long unicode::endian_swap<T>::operator ()(T &);的调用 endian_swapunsigned long实例化(其中 传递unsigned short需要临时的),或者 您发布的代码不是触发错误的代码。