加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:41:24 所属栏目:百科 来源:网络整理
导读:我有两个operator()重载,一个采用函数引用,它接受任何类型作为参数并返回任何类型.另一个采用函数引用,它将任何类型作为参数但返回void.在我的课程实例化后,我得到以下错误: In instantiation of 'Avoid,int': error: 'void AT,F::operator()(void ()(F)) [
我有两个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);
}

这些错误仅在第一个模板参数T为空时发生.我想知道我做错了什么以及为什么我不能以这种方式重载operator()?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读