功能专用模板问题

时间:2010-11-20 15:39:26

标签: c++ templates template-specialization

我是模板新手。我尝试为函数模板定义专用模板,但我的编译器返回错误。它是简单的最大功能,只写练习模板;这是代码:

template <typename TYP1, typename TYP2> TYP1 maximum(TYP1& param1, TYP2& param2)
{
    return (param1 > param2 ? param1 : param2);
}

和专业功能:

template<> std::string maximum<std::string, std::string>(std::string prm1, std::string prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

如果我尝试为std :: string或任何其他类型编写特化,包括我自己定义的类,则无关紧要 - 错误始终相同:

“错误C2912:显式特化;'std :: string maximum(std :: string,std :: string)'不是函数模板的特化......”

IntelliSense建议:“没有功能模板的实例”

我应该更改什么才能使其编译并正常工作?

提前致谢

2 个答案:

答案 0 :(得分:10)

你忘记了字符串前面的&。它期望引用类型,您的“专业化”使用值类型。

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)

答案 1 :(得分:3)

这不是专业化,因为主模板需要TYP1&TYP2&参数。您可以使用以下方法修复代码:

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

注意参数是通过引用获得的。