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

csg*_*guy 1 c++ copy-constructor

我有 2 个课程,User,和BBoard(公告板)。

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

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

// private:
//   std::string title;
//   std::vector<User> userList;
//   User currentUser;
//   std::vector<Message> messageList;
Run Code Online (Sandbox Code Playgroud)

BBoard这是推回s的成员函数User

while (inFS >> dataName && inFS >> dataPass) {
  User x(dataName, dataPass);
  userList.push_back(x);
}
Run Code Online (Sandbox Code Playgroud)

BBoard这是检查 a 是否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;
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误是这样的:

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 {
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*hik 5

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

bool BBoard::userExists(const string& uName, const string& uPass) const
Run Code Online (Sandbox Code Playgroud)

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

currentUser = userList.at(i);
Run Code Online (Sandbox Code Playgroud)

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