我很难获得接受常规c风格字符串的模板特化的正确语法。例如
namespace RubyUtils
{
template<class T> VALUE toValue(const T& v);
};
template<> VALUE toValue(char const* & v)
{
return toValue<string>(v);
}
然后在通话网站
return RubyUtils::toValue("Life the universe and everything");
给出错误
unresolved external symbol "unsigned long __cdecl RubyUtils::toValue<char const [33]>(char const (&)[33])"
我应该如何构建专门化来启用传入c风格的字符串?
更新:修复了模板专精化,使其具有正确的语法模板=&gt;模板&LT;&GT;
答案 0 :(得分:1)
我认为您遇到的问题可能与您定义了两个模板有关 - 一个在命名空间内,另一个在外。错误可能是由于这种混淆。
但更重要的是,作为一般规则,你不想要专门化功能模板。函数的模板特化具有许多与之相关的时髦规则,几乎普遍导致调用错误的东西。相反,只需使用常规函数重载:
namespace RubyUtils
{
template<class T> VALUE toValue(const T& v);
VALUE toValue(char const* v)
{
return toValue<string>(v);
}
};
函数重载的方式有效,使用C风格的字符串调用toValue
函数将导致非模板toValue
在toValue
模板之前被选中,基本上是专业为您服务。更一般地说,使用函数模板,更喜欢使用重载到专门化。它更安全。