私はいくつかのSFINAE機能を使用しています。現在、LinuxおよびWindowsで実行する必要があるアプリケーションの一部にあります。コンパイラの選択肢は、Windowsアプリケーションの場合はMSVC(Visual Studio 2010 10.0)、Linuxアプリケーションの場合はGCC4.4.5です。
特定のオブジェクトがカスタムシリアル化を実行してこの関数を呼び出すための関数を提供しているかどうか、またはカスタムシリアル化メソッドが提供されていないときにmemcpy
単純なものを実行するかどうかを確認する必要があります。sizeof(Object)
問題は、コードの一部がMSVCで警告やエラーなしでコンパイルされることですが、GCCでコンパイルしている間、コードは次のようになります。
template
<
typename Type,
typename Return,
typename Parameter,
Return (Type::*Pointer)(Parameter) const
> struct sMemberMethodConst { };
template
<
typename Type,
typename Return,
typename Parameter,
Return (Type::*)(Parameter)
> struct sMemberMethod { };
template<typename T> struct sMemberMethodChecker
{
template <typename Type> static char HasCustomSizeMethod(sMemberMethodConst<Type, size_t, void, &Type::Size> *);
template <typename Type> static long HasCustomSizeMethod(...);
template <typename Type> static char HasSerializeMethod(sMemberMethodConst<Type, size_t, void * const, &Type::Serialize> *);
template <typename Type> static long HasSerializeMethod(...);
template <typename Type> static char HasDeserializeMethod(sMemberMethod<Type, size_t, const void * const, &Type::Deserialize> *);
template <typename Type> static long HasDeserializeMethod(...);
// Other specific method checks...
enum
{
HAS_CUSTOM_SIZE_METHOD = (sizeof(HasCustomSizeMethod<T>(0)) == sizeof(char)),
HAS_SERIALIZE_METHOD = (sizeof(HasSerializeMethod<T>(0)) == sizeof(char)),
HAS_DESERIALIZE_METHOD = (sizeof(HasDeserializeMethod<T>(0)) == sizeof(char)),
IS_CUSTOM = HAS_CUSTOM_SIZE_METHOD &&
HAS_SERIALIZE_METHOD &&
HAS_DESERIALIZE_METHOD,
// Other 'shortcuts'...
};
そして、GCCでコンパイルしているときに発生するエラーは次のとおりです。
invalid parameter type 'void' in declaration template<class Type, class Return, class Parameter, Return (Type::* Pointer)(Parameter)const>
の最初の行にありstruct sMemberMethodChecker
ます。sを見逃したり、単語を置き忘れたりしていないことは確かですtypename
が、なぜエラーが発生するのか理解できず、エラーも理解できません。
私はMSVCが標準に緩いことを知っていますが、GCCは標準にかなりよく準拠しているので、問題は愚かなコードを許可するMSVC側にあるのだろうかと思います!
質問は次のとおりです。
- なぜ
invalid parameter type 'void'
エラーが発生するのstruct sMemberMethodChecker
ですか? - コードがMSVCでは有効であるのに、GCCでは無効であるのはなぜですか。
- このコードは非標準ですか?
- SFINAEのトリックはC++11専用ですか?