2

重複の可能性:
「私の SFINAE に何が起こったのか」の復習: 条件付きテンプレート クラス メンバー?

テンプレート クラスに他のパラメーターを渡すことができないのはなぜですか? 渡された型がリテラル型である場合にのみ、特定のパラメーターを有効にしようとしています。そうでない場合は、他の型を受け入れますが、Case-Sensitive パラメーターを有効にしないでください。

以下がコンパイルされないのはなぜですか?

#include <iostream>
#include <type_traits>

template<typename T>
struct is_literal
{
   enum{value = false};
};

template<>
struct is_literal<char>
{
   enum{value = true};
};

template<>
struct is_literal<char*>
{
   enum{value = true};
};

template<>
struct is_literal<const char*>
{
   enum{value = true};
};

template<typename Char, typename Traits, typename Alloc>
struct is_literal<std::basic_string<Char, Traits, Alloc>>
{
   enum
   {
      value = true
   };
};

template<typename T>
class Test
{
    public:
        bool Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type  CaseSensitive = true);
};

template<typename T>
bool Test<T>::Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type CaseSensitive)
{
    return true;
}


int main()
{
    Test<int> F;    //This line gives errors.. It gives none if I pass char, char*, const char*, std::string.
    F.Contains(1);
}
4

1 に答える 1

3

SFINAE は、オーバーロードの解決中に置換が実行された場合にのみ発生する可能性があります。つまり、関数テンプレートが必要です。この場合、クラス テンプレートに非テンプレート関数があります。それはうまくいきません。これを修正するには、デフォルトのテンプレート パラメータを追加します。

template <typename U = T>
bool Contains(U DataType, typename std::enable_if<is_literal<U>::value, bool>::type  CaseSensitive = true);
于 2012-12-20T20:30:54.507 に答える