C ++ 11中具有多个模板参数的模板功能的专业化

时间:2018-08-14 11:01:42

标签: c++ templates template-specialization

无法找出为什么我通过以下代码得到编译器错误:

#include <tchar.h>

typedef TCHAR Char;

typedef std::basic_string<Char> String;

template<typename C, typename T>
std::basic_string<C> InternalToString(T val);

template<typename T>
inline std::string InternalToString<char, T>(T val)
{
    return std::to_string(val);
}

template<typename T>
inline std::wstring InternalToString<wchar_t, T>(T val)
{
    return std::to_wstring(val);
}

template<typename T>
inline String ToString(T val)
{
    return InternalToString<Char, T>(val);
}

如果我使用MSVC 2017编译代码,则会收到“错误C2768:'InternalToString':非法使用显式模板参数”

1 个答案:

答案 0 :(得分:8)

Partial specialization不适用于功能模板,只能用于类模板。

您可以使用SFINAE重载功能模板。例如

// used when C is specified as char
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, char>::value, std::string>::type InternalToString(T val)
{
    return std::to_string(val);
}

// used when C is specified as wchar_t
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, wchar_t>::value, std::wstring>::type InternalToString(T val)
{
    return std::to_wstring(val);
}

// used when C is specified as other types
template<typename C, typename T>
typename std::enable_if<!std::is_same<C, char>::value && !std::is_same<C, wchar_t>::value, std::basic_string<C>>::type InternalToString(T val);