C++错误:无法调用'(std :: string {aka std :: basic_string <char>})(std :: string&)'

Dre*_*mer 5 c++ string constructor compiler-errors initialization

我是C++的新手.我搜索了很多次,但仍然无法得到答案.我正在写一个名为Course的课程来描述学生在学校学习的课程.Course类有3个文件:

protected:
    string courseName;
    int courseNum;
    float score; 
Run Code Online (Sandbox Code Playgroud)

我有一个公共方法"setName"来设置课程名称:

Course &setName(string name)
{
    this->courseName(name);
    return (*this);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译时,编译器抱怨: C++错误:无法调用'(std :: string {aka std :: basic_string})(std :: string&)' 我也尝试将代码修改为Course&setName(string&name)...编译器一直抱怨同样的错误.

但是,如果我将代码更改为:

Course &setName(string name)
{
    this->courseName = name;
    return (*this);
}
Run Code Online (Sandbox Code Playgroud)

然后它运作良好.我无法理解编译器在抱怨什么以及为什么我不能使用直接初始化?

And*_*owl 6

我无法理解编译器在抱怨什么以及为什么我不能使用直接初始化?

因为那不是初始化.这是一项任务.赋值和(复制)初始化都使用了=符号,但不要让那个愚弄你:这两件事情根本不同.

初始化是在构造时为对象赋予值的原因.当你的setName()成员函数被调用,已建在它被调用的对象(以及它的数据成员).如果你想在那里初始化它们,你迟到了:你错过了火车.

另一方面,在构造函数的初始化列表中,您可以按如下方式初始化数据成员:

Course::Course(std::string name) : courseName(std::move(name)) { }
//                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                 This would be initialization
Run Code Online (Sandbox Code Playgroud)