为什么我得到错误operator()不能重载?

时间:2012-12-23 13:37:31

标签: c++

我有两个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()

1 个答案:

答案 0 :(得分:7)

好吧,如果Tvoid,那么你有两个完全相同原型的函数定义 - 打破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)) {}
};