嵌套模板特化导致“非法使用显式模板参数”?

时间:2012-03-24 09:33:07

标签: c++ templates

如何专门设计嵌套模板? (见下面的错误。)

using std::reverse_iterator;

template<typename It>
reverse_iterator<It> make_reverse_iterator(const It &it)
{
    return reverse_iterator<It>(it);
}

template<typename It>
It make_reverse_iterator<reverse_iterator<It> >(const reverse_iterator<It> &it)
{
    // Above                     ^
    // error C2768:
    //   'make_reverse_iterator': illegal use of explicit template arguments
    return it.base();
}

2 个答案:

答案 0 :(得分:6)

这是功能模板的部分特化。这是不允许的。

您可以使用重载来解决此示例中的问题:

template<typename It>
It make_reverse_iterator(const reverse_iterator<It> &it)
{
    return it.base();
}

如果重载不起作用,您可以使用类模板的部分特化。

答案 1 :(得分:4)

这是partial function template specialization,不允许这样做。但是,您可以通过重载函数来实现相同的效果:

template<typename It>
It make_reverse_iterator(const reverse_iterator<It> &it)
{
    return it.base();
}

以上不是模板专精,而是make_reverse_iterator的模板重载,参数为const_reverse_iterator<It>