【问题标题】:invalid initialization of non-const reference of type 'std::string&'std::string& 类型的非常量引用的无效初始化
【发布时间】:2013-01-07 16:00:14
【问题描述】:
const string& mtm::RadioManager::getBestSong() const {    
    string& most_popular_song=tmp.getName();    
    most_popular_song = current_song.getName();    
    return most_popular_song;
}

string mtm::Song::getName() const {    
    return this->song_name;
}

class Song {    
    string song_name;

public:

string getName() const;
}

我得到这个错误:

从“std::string{aka”类型的右值对“std::string& {aka std::basic_string&}”类型的非常量引用的初始化无效 std::basic_string}'

我做不到const string& most_popular_song=tmp.getName(); 因为我将其更改为tmp.getName(); 即返回string! 我应该怎么做才能摆脱这个错误?

【问题讨论】:

  • “因为我要改成tmp.getName()”是什么意思?究竟改变了什么?
  • @AndreyT 我认为他的意思是“我将其更改为 current_song.getName();”
  • 抱歉忘记了这行:const Song& tmp = *(all_songs.begin());
  • 之前:string& most_popular_song=tmp.getName();

标签: c++ methods reference initialization return


【解决方案1】:

函数getName 不提供对类的基础song_name 字段的修改访问。不管你做什么,你都不能改变song_name 到getName(如所写)。这就是让getName 返回song_name 字段的副本 的全部意义所在。

因此,通过非常量引用接收结果毫无意义。反正你也改不了。而且即使你以某种方式这样做,它也不会影响song_name。

在这种情况下,完全不清楚你要做什么

string& most_popular_song=tmp.getName();    
most_popular_song = current_song.getName();    

序列以及所有这些操作的意义。

如果您希望能够修改song_name 字段,您必须从getName 返回song_name 的引用

string &mtm::Song::getName() const {    
    return this->song_name;
}

这将修复您的错误,但这基本上会破坏getName 函数提供的大部分保护和隔离。如果您立即通过返回 getName 函数的 nopn-const 引用将其完全暴露给外界,那么将 song_name 设为私有有什么意义?

一个更好的主意是编写一个setName 函数并使用它来修改song_name,而不是尝试获得对song_name 的直接引用访问。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2018-04-26
    • 2015-01-26
    • 2013-10-11
    • 1970-01-01
    • 2012-12-18
    • 2012-08-02
    • 2013-09-04
    相关资源
    最近更新 更多