0

我很难为接受常规 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 风格的字符串?

更新:修复了模板专业化以具有正确的语法模板 => 模板<>

4

1 回答 1

1

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

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

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

函数重载的工作方式,toValue使用 C 风格的字符串调用函数将导致非模板toValue在模板之前被选中toValue,本质上是为你做特化。更一般地说,对于函数模板,更喜欢使用重载而不是专门化。只是更安全。

于 2011-01-09T23:23:23.010 回答