C++ 默认复制构造函数不可行

C++ Default Copy Constructor Not Viable

我有 2 个 类、UserBBoard(公告栏)。

我在 BBoard 中有一个成员函数,它检查从文件中读取数据并将其推回向量 userList。我还有一个检查User是否存在的成员函数(如果User存在,我想使用默认的复制构造函数并将其分配给currentUser

这些是我在 BBoard 中的私有变量:

// private:
//   std::string title;
//   std::vector<User> userList;
//   User currentUser;
//   std::vector<Message> messageList;

这是BBoard中推回Users的成员函数:

while (inFS >> dataName && inFS >> dataPass) {
  User x(dataName, dataPass);
  userList.push_back(x);
}

这是 BBoard 中的成员函数,它检查 User 是否存在并尝试使用默认复制构造函数将其分配给 currentUser

bool BBoard::userExists(const string& uName, const string& uPass) const {
  for (int i = 0; i < userList.size(); ++i) {
    if (userList.at(i).getUsername() == uName) {
      if (userList.at(i).check(uName, uPass)) {
        currentUser = userList.at(i);    //<-- HERE
        return true;
      }
    }
  }
  return false;
}

我得到的错误是:

BBoard.cpp:153:21: error: no viable overloaded '='
        currentUser = userList.at(i);
        ~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~
./User.h:8:7: note: candidate function (the implicit copy assignment operator) not viable:
      'this' argument has type 'const User', but method is not marked const
class User {

我没有在 User 中声明复制构造函数,所以我希望隐式创建的复制构造函数能够工作。我也没有推回const User

根据https://en.cppreference.com/w/cpp/language/copy_constructor 隐式复制构造函数具有这种形式:T::T(const T&) 所以我不确定哪里出错了。

我可以提供程序的任何其他部分。

这与任何复制构造函数无关。

bool BBoard::userExists(const string& uName, const string& uPass) const

这定义了一个const class 方法。这就是声明末尾的 const 关键字的含义。 const class 方法不能修改其 class 的任何成员,它们都有效地 const 方法(除非显式声明 mutable,这不是这里的情况)。

currentUser = userList.at(i);

这试图修改 class 的成员。由于它实际上是 const class 成员,因此无法修改。