为模板化函数定义特定案例(C ++)

时间:2010-08-04 13:32:54

标签: c++ templates

所以在我的.h文件中我有

template <class T>
void getValue(T *val, int element, int index);

然后在我的.cc文件中我有一个函数:

template <class T>
void RParser::getValue(T *val, int element, int index)
{

我也明确地实例化了它:

    template void RParser::getValue<char>(char *val, int element, std::string subrecName);
    template void RParser::getValue<long long>(long long *val, int element, std::string subrecName);
    template void RParser::getValue<float>(float *val, int element, std::string subrecName);
...

这有效,但我想为std :: string

创建一个完全不同的函数

我试过了:

template <class std::string>
void RParser::getValue<std::string>(std::string * val, int element, int index)
{

但这没效果。

非常感谢任何建议,

谢谢, 约什

3 个答案:

答案 0 :(得分:4)

根本不要使用模板 - 只是一个普通的功能:

void RParser::getValue(std::string * val, int element, int index)
{
}

答案 1 :(得分:2)

如果要专门化模板,则语法为:

template<> 
void RParser::getValue<std::string>(std::string* val, int element, int index) {}

但正如尼尔的回答所说,你不需要专门化这个功能模板;过载将完成这项工作:

void RParser::getValue(std::string* val, int element, int index) {}

答案 2 :(得分:1)

专门化一个类的模板成员函数是非法的C ++。我认为在C ++ 00x中这已经放松了。强调文本

编辑:

class foo {
    template <typename T> T bar(const T & t){
        return t;
    }

    template <> int bar<int>(const int & t){ 
        return t + 1 ;
    }
};


int main(int c, const char * v[]){
    foo f;
}

编译时

 % gcc /tmp/foo.cpp
/tmp/foo.cpp:6: error: explicit specialization in non-namespace scope ‘class foo’
/tmp/foo.cpp:6: error: template-id ‘bar<int>’ in declaration of primary template