c风格字符串的模板特化

时间:2011-01-09 23:17:11

标签: c++ string template-specialization

我很难获得接受常规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;

1 个答案:

答案 0 :(得分:1)

我认为您遇到的问题可能与您定义了两个模板有关 - 一个在命名空间内,另一个在外。错误可能是由于这种混淆。

但更重要的是,作为一般规则,你想要专门化功能模板。函数的模板特化具有许多与之相关的时髦规则,几乎普遍导致调用错误的东西。相反,只需使用常规函数重载:

namespace RubyUtils
{
    template<class T> VALUE toValue(const T& v);
    VALUE toValue(char const* v)
    {
        return toValue<string>(v);
    }
};

函数重载的方式有效,使用C风格的字符串调用toValue函数将导致非模板toValuetoValue模板之前被选中,基本上是专业为您服务。更一般地说,使用函数模板,更喜欢使用重载到专门化。它更安全。