【问题标题】:error: non-static reference member - can't use default assignment operator错误:非静态引用成员 - 不能使用默认赋值运算符
【发布时间】:2025-11-26 17:55:02
【问题描述】:

我有一个问题......好吧,我不确定。我真的不知道这意味着什么。我使用了下图所示的相同范例,我在类中创建了一个对象,并为该对象提供了对该类的引用。此设计用作​​事件处理程序。

我添加了一段非常不相关的代码,我在其中循环遍历对象映射并重新分配它们。由于使用了= 运算符,它引发了一个问题。但我仍然不知道它在抱怨什么。

// Example program
#include <iostream>
#include <string>
#include <map>

class A {  
    public:
        class Handler {
            public:
                Handler(A &a):a(a){}
                virtual void HandleIt(){
                    a.DoThings();   
                }
                A &a;
        };
    
        A():my_handler(*this){}
        Handler my_handler;
        void DoThings(){
            std::cout << "Im doing things";   
        }
};

std::map<std::string, A> my_map;

void ReplaceInMap(A &a){
    std::map<std::string, A>::iterator it;
    for(it = my_map.begin(); it != my_map.end(); ++it){
        it->second = a;
    }
}

int main()
{
    A a;
    A b;
    A c;
    
    my_map.insert(std::make_pair<std::string, A>("A!", a));
    my_map.insert(std::make_pair<std::string, A>("B!", b));
    my_map.insert(std::make_pair<std::string, A>("C!", c));
    
    ReplaceInMap(a);
}

C++ 98

In member function 'A::Handler& A::Handler::operator=(const A::Handler&)':
8:15: error: non-static reference member 'A&A::Handler::a', can't use default assignment operator  
In member function 'A& A::operator=(const A&)': 6:7: 
note: synthesized method 'A::Handler& A::Handler::operator=(const A::Handler&)' first required here   
In function 'void ReplaceInMap(A&)': 29:20: note: synthesized method 'A& A::operator=(const A&)' first required here

http://cpp.sh/4chmu

这个错误是什么意思?有什么问题?

【问题讨论】:

  • 问题出在错误中——你试图复制你的类,但是隐式复制赋值运算符被删除了,因为 Handler 也有一个删除的复制赋值,并且 那个 i> 发生是因为它有一个 A&amp; 作为成员。您必须为这两个类定义自己的复制 ctor 和分配。
  • @d4rk4ng31 我看不出那里的a(a) 有什么问题...似乎这正是预期的结果-初始化成员引用:思考:编辑:我现在看到你了正在谈论复制 ctor,但代码中没有定义复制 ctor,所以,不知道您的意思是什么
  • @d4rk4ng31 第一个“a”是成员,第二个是参数。也就是说,没有阴影。 (不过,它不是复制构造函数。)
  • @molbdnilo 好吧,在初始化程序的情况下存在阴影。 mem-initializer-id 中没有阴影。

标签: c++


【解决方案1】:

这个错误是什么意思?

意思是字面意思。不能使用A 的赋值运算符,因此不能使用Handler

要点:

  • 引用不可分配。
  • 该类包含一个引用成员,并且没有用户定义的赋值运算符。因此这个类是不可分配的。
  • 您尝试分配该类的对象。

有什么问题?

你试图分配一个不可分配的类。

您的选择是:

  • 不要使用引用成员。使用指针或引用包装器(标准库自 C++11 起就有一个),两者都是可赋值的。
  • 不要分配对象。

【讨论】:

  • 我不敢相信这是我第一次看到这个问题。这是我第一次在带有引用的对象上使用复制 ctor 或 = 运算符时如何......无论如何,谢谢。
  • 第三个选项:定义你自己的赋值运算符来做正确的事情(不管是什么——取决于对象试图用那个引用做什么。)
  • @ChrisDodd 同样,这样的赋值操作符是否可以实现也取决于一个人想要做什么。在大多数情况下不是,这就是为什么我把它排除在答案之外。
最近更新 更多