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

C++ Default Copy Constructor Not Viable

本文关键字:不可行 构造函数 复制 默认 C++      更新时间:2023-10-16

我有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类方法。这就是声明末尾的尾随const关键字的含义。const类方法不能修改其类的任何成员,它们都有效地const到该方法(除非显式声明mutable,这里不是这种情况(。

currentUser = userList.at(i);

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