【问题标题】:operator() template specializationoperator() 模板特化
【发布时间】:2011-12-29 14:46:06
【问题描述】:

我正在尝试对模板运算符进行专门化,模板如下所示:

 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()”

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

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

【问题讨论】:

  • 当您说“规范”时,您的意思是“专业化”吗?
  • 我认为 [this SO question/answer][1] 可能正在回答您正在尝试做的事情。 [1]:stackoverflow.com/questions/4920068/…
  • 什么是ResultType?它应该是您的模板参数之一吗?
  • 这两个声明到底发生在哪里?正如消息所示,不允许您在类定义中专门化函数。
  • @Ran 那么您的专业化与您尝试专业化的模板不匹配 - 它必须如此。对于size 参数,您使用unsigned long 而不是size_t,对于worst_dist,使用float 而不是ResultType

标签: c++ templates


【解决方案1】:

你为什么要专门化这个运算符呢?无论如何,您将无法使用取决于专业化的语法(即显式提供 [一些] 模板参数)来调用它!只需使用重载就可以了。虽然有时需要甚至有必要在显式指定模板参数的地方使用符号,但对于一般的函数来说,使用特化而不是重载往往不是那么重要。

我只是在标准中阅读了一些内容,实际上可以提供明确的专业化,但是它必须在类定义之外。例如:

#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!
}

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

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2022-01-21
    • 2012-06-21
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多