专门用于处理std :: string和char []参数的模板成员函数

时间:2012-03-04 21:41:51

标签: c++ templates

我有一个类的模板成员函数,我用它来向列表添加各种不同的类型,特殊处理和包装(所有内容最终都包含在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中,如果有任何特殊的怪异,但我觉得我搞砸了一些基本的东西。

3 个答案:

答案 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])

但是你的问题是你不能部分专门化一个功能。你可以做的是定义一个简单的重载,这将是首选的并从编译器中调用。