operator()模板专业化

时间:2011-12-29 14:46:07

标签: c++ templates

我正在尝试对模板运算符进行专门化,模板看起来像这样:

 template <typename Iterator1, typename Iterator2>
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const

在我完成了这样的专业化之后:

template <>
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const

我在编译期间遇到错误:

  

不能在类范围内专门化'operator()'函数

所有这些功能都在结构模板中

我很乐意得到一些帮助。 感谢。

1 个答案:

答案 0 :(得分:8)

为什么你想专门研究这个运营商呢?无论如何,您将无法使用依赖于特化的语法(即显式提供[某些]模板参数)来调用它!只是使用重载,你应该没事。虽然有时需要或甚至有必要使用显式指定模板参数的符号,但对于通常使用特化而不是重载的函数来说,它往往并不重要。

我只是在标准中读取内容,实际上可以提供显式的特化,但它必须在类定义之外。例如:

#include <iostream>

struct foo
{
    template <typename T> void operator()(T const&) {
        std::cout << "general\n";
    }
};

template <>
void foo::operator()<int>(int const&) {
    std::cout << "int spec\n";
}

int main()
{
    foo f;
    f(1.2);
    f(1);
    f<double>(1); // <-- ERROR: doesn't work!
}

使用重载会有同样的效果。但是,使用显式指定的模板参数仍然不起作用。