C ++错误:无法匹配对'(std :: string {aka std :: basic_string <char>})(std :: string&amp;)'</char>的调用

时间:2013-06-23 16:47:46

标签: c++ string constructor compiler-errors initialization

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

protected:
    string courseName;
    int courseNum;
    float score; 

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

Course &setName(string name)
{
    this->courseName(name);
    return (*this);
}

但是,当我尝试编译时,编译器抱怨: C ++错误:无法匹配调用'(std :: string {aka std :: basic_string})(std :: string&amp;)' 我还尝试将代码修改为课程&amp; setName(字符串和名称)...... 并且编译器一直抱怨同样的错误。

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

Course &setName(string name)
{
    this->courseName = name;
    return (*this);
}

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

2 个答案:

答案 0 :(得分:6)

  

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

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

初始化是指构造时对象的值。调用setName()成员函数时,已经构造了调用它的对象(以及它的数据成员)。如果你想在那里初始化它们,你迟到了:你错过了火车。

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

Course::Course(std::string name) : courseName(std::move(name)) { }
//                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                                 This would be initialization

答案 1 :(得分:1)

您正在尝试一个字符串的值分配给另一个已经初始化的字符串。其语法是

std::string s1 = ....;
std::string s2 = ....;
s2 = s1; // OK, assignment

而你正在尝试相当于

s2(s1); // error, this is no way to assign s1 to s2

在这种情况下,语法无效。您不能初始化已构建的对象。