c ++试图在不存在的构造函数中引用已删除的函数(使用rapidJson)

c++ attempting to reference a deleted function in non existing constructor (using rapidJson)

我目前遇到这个错误: 'User::User(const User&)': 试图引用已删除的函数

程序将对象的字符串值传递到 class。

用户构造函数:

User::User(string s){
    int size = s.length() + 1;
    char* cstr = new char[size];
    strcpy_s(cstr, size, s.c_str());
    user.Parse(cstr);
}

主循环:

int main(){
    //json equals something similar to this: "{\"body:{[{"user":1},{"user":1},{"user":1}]}\"}";
    const char * json;
    Document d;
    d.Parse(json);
    if (d.HasMember("body")) {
        if (d["body"].IsArray()) {
            for (SizeType i = 0; i < d["body"].Size(); i++) {
                string json = getJsonString(d["body"][i]);
                User u = User(json); \this is where the error point to
                this->users.push_back(u);
            }
        }
    }
}

getJsonString 函数:

string getJsonString(Value& value) {
    StringBuffer buffer;
    buffer.Clear();
    Writer<StringBuffer> writer(buffer);
    value.Accept(writer);
    return string(buffer.GetString());
}

我搜索了很多关于这个错误的解释,但对我来说似乎没有任何意义。我认为它与向量数组有关,但它对我来说没有意义,因为我没有为任何用户值使用指针或引用。它似乎指向构造函数,但是没有传递任何指针或引用。我通过返回 json 的字符串来完成,我没有使用指针,但也许我实际上是?如果对我做错的任何解释,我将不胜感激。

User不可复制;这意味着:

  • User::User(const User&)(复制构造函数)是private
  • 或已删除 (= delete;)
  • 或隐式删除(例如 class 具有不可复制的成员,或继承自不可复制的 class)。谢谢 Yksisarvinen 的评论

这意味着您不能从另一个创建新的User

然后,如果你想在 vector 中存储 User 个对象(就像你 "apparently" 试图在你的 post 中做的那样,我说 "apparently" 因为 posted 代码无法编译,我不知道 this) 你不能按值存储它们,因为包含的 vector 需要一个可访问的复制构造函数。

std::vector:

T must meet the requirements of CopyAssignable and CopyConstructible.

但是,您可以将它们存储为指针:

std::vector<std::shared_ptr<User>> users;
users.push_back( std::shared_ptr<User>( new User( json ) );