#include <type_traits>
using namespace std;
template<class T> struct IsCharType { enum { value = false }; };
template<> struct IsCharType<char> { enum { value = true }; };
template<> struct IsCharType<wchar_t> { enum { value = true }; };
template<class CharType, class = enable_if<IsCharType<CharType>::value>::type>
struct MyString
{
MyString()
{}
MyString(CharType*)
{}
};
template<class CharType>
MyString<CharType> GetMyString(CharType* str) // error C2923
{
return MyString<CharType>(str);
}
int main()
{}
我的编译器是 VC++ 2013 RC。由于错误 C2923,无法编译上述代码。
错误 C2923:“MyString”:“std::enable_if::value,void>::type”不是参数“”的有效模板类型参数
但是,如果我改变
template<class CharType, class = enable_if<IsCharType<CharType>::value>::type>
至
template<class CharType, class = typename enable_if<IsCharType<CharType>::value>::type>
然后就可以了。
我只是想知道为什么typename
这里有必要?在这种情况下,我有两个原因:
编译器可以推断出第二个模板参数是否是类型名称;因为我把它贴为
class
.即使编译器无法推断它是否是类型名称,根据规则,编译器也不应该因为没有调用
SFINAE
模板函数而失败。GetMyString