私はコンパイルエラーがあります。損失
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) };
};
更新: はそれを見つけました!上記のテンプレートを注意深く見て、あなたがそれを見ることができるかどうかを見てください。
あなたのエンディアンスワップ関数は、 'T'が署名されていると正しく機能しません。また、 '_val'を参考にする理由もありません。 –
+1は「通常Googleは私に答えを与える」! –
@BenVoigtこれは設計上、すべてのテンプレートパラメータが強制的に署名されていません。 – Twifty