我有一个类的模板成员函数,我用它来向列表添加各种不同的类型,特殊处理和包装(所有内容最终都包含在var对象中)用于特定类型:
template<typename V> const var& addvar(const V& v);
template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/}
但是,我正在传递这样的字符串(好吧,const char数组):
object.addvar("lol");
虽然我将所有内容都作为std :: strings处理,但它在模板参数类型推导中作为某种const char数组引用弹出。所以我得到一个关于没有函数的错误,即使使用上面的std :: string特化。我熟悉模板数组大小减少,所以我试图用这种格式创建一个可以处理这种事情的addvar,如:
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
但是关于非法引用数组的编译错误,事情变得非常可怕。这是在VC ++ 2010中,如果有任何特殊的怪异,但我觉得我搞砸了一些基本的东西。
答案 0 :(得分:4)
你不能部分专门化模板功能,所以它必须是一个重载(=一个模板不与初始addvar
模板函数共享任何东西):
template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/}
答案 1 :(得分:1)
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
^
在&
之后删除const char
,你试图专门研究那种方式的引用数组,这不是你想要的(并且无论如何都是非法的)。
答案 2 :(得分:1)
该功能如下所示:
template <std::size_t N>
void foo(const char (&a)[N])
但是你的问题是你不能部分专门化一个功能。你可以做的是定义一个简单的重载,这将是首选的并从编译器中调用。