为什么我无法使错误操作员()无法超载

Why am I getting the error operator() cannot be overloaded?

本文关键字:超载 操作员 为什么 错误      更新时间:2023-10-16

我有两个 operator()的过载,一个函数参考将任何类型作为其参数作为其参数并返回任何类型。另一个获取函数参考的函数引用将任何类型作为其参数但返回void。我的班级实例化后,我会收到以下错误:

In instantiation of 'A<void, int>':
error: 'void A<T, F>::operator()(void (&)(F)) [with T = void, F = int]' cannot be overloaded
error: with 'void A<T, F>::operator()(T (&)(F)) [with T = void, F = int]'

template <typename T, typename F> struct A {
    void operator()(T (&)(F)) {}
    void operator()(void (&)(F)) {}
};
void f(int) {}
int main() {
    A<void, int> a;
    a(f);
}

这些错误仅在第一个模板参数Tvoid时才发生。我想知道我在做什么错,为什么我不能以这种方式超载operator()

好吧,如果 Tvoid,那么您有两个函数定义,具有完全相同的原型 - breaking odr。

尝试专业的结构以防止这种情况:

template <typename T, typename F> struct A {
    void operator()(T (&)(F)) {}
    void operator()(void (&)(F)) {}
};
template <typename F> struct A<void, F> {
    void operator()(void (&)(F)) {}
};