我正在尝试对模板运算符进行专门化,模板看起来像这样:
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()'函数
所有这些功能都在结构模板中
我很乐意得到一些帮助。 感谢。
答案 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!
}
使用重载会有同样的效果。但是,使用显式指定的模板参数仍然不起作用。