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

tem*_*boy 3 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);
}
Run Code Online (Sandbox Code Playgroud)

当第一个模板参数这些错误只发生Tvoid.我想知道我做错了什么以及为什么我不能以operator()这种方式超载?

Pub*_*bby 7

好吧,如果T是,void那么你有两个功能定义与完全相同的原型 - 打破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)) {}
};
Run Code Online (Sandbox Code Playgroud)

  • @templateboy*[一个定义规则](http://en.wikipedia.org/wiki/One_Definition_Rule) (2认同)