損失

2013-07-19 21 views
10

私はコンパイルエラーがあります。損失

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

更新: はそれを見つけました!上記のテンプレートを注意深く見て、あなたがそれを見ることができるかどうかを見てください。

+0

あなたのエンディアンスワップ関数は、 'T'が署名されていると正しく機能しません。また、 '_val'を参考にする理由もありません。 –

+0

+1は「通常Googleは私に答えを与える」! –

+0

@BenVoigtこれは設計上、すべてのテンプレートパラメータが強制的に署名されていません。 – Twifty

答えて

5

どのようにテンプレートをインスタンス化していますか? endian_swapのインスタンシエーションはTタイプを使用し、unsigned shortとします。 Tunsigned shortである場合を除き、 の変換が必要であり、変換の結果は一時的ではない であり、非const参照にバインドできません。

あなたはSSCCEを提供していないので、言い表せません。しかし、あなたが投稿し メッセージがunsigned long unicode::endian_swap<T>::operator()(T &);いずれか endian_swapへの呼び出しを指しエラーが( 場合ここで、unsigned shortを渡すと、一時的に必要となる)unsigned longのためにインスタンス化される、またはあなたが投稿 コードは、エラーを引き起こしたコードではありません。

+0

実際のデータ型は 'std :: codecvt :: intern_type'で、作成時に' unsigned short'と設定されています。 – Twifty

+0

試してみるためにいくつか提案してください。この髪の上に私の髪を引っ張る。 :/ – Twifty

+0

これが当てはまる場合、コンパイラの診断は絶望的にマークを逃してしまいます。 –