2011-01-09 47 views
0

我很难得到接受常规c风格字符串的模板专业化的正确语法。例如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风格的字符串?

UPDATE:固定模板专业化有正确的语法模板=>模板<>

+1

为什么命名空间中不是两个模板? – Jon 2011-01-09 23:20:01

回答

1

我认为你遇到的问题可能与你已经定义了两个模板的事实 - 一个在命名空间里面,还有一个。错误可能是由于这种混淆。

但更重要的是,作为一般规则,您要而不是想要专门设计功能模板。功能模板专门化有很多与它相关的时髦规则,几乎普遍导致错误的事情被调用。相反,只要使用正规的函数重载:

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

的单向函数重载作品,调用toValue功能与C风格的字符串,将导致非模板toValue得到选择提前toValue模板,基本上从事专门为你。更一般地说,对于函数模板,更喜欢使用重载来专门化。这只是更安全。