比较C++字符串

3
class Song {

public:
    const string getAutherName();
}

void mtm::RadioManager::addSong(const Song& song,const Song& song1) {

    if (song.getAutherName() == song1.getAutherName())

}

我收到了这个错误信息:
Invalid arguments ' Candidates are: std::basic_string<char,std::char_traits<char>,std::allocator<char>> getAutherName() ' - passing 'const mtm::Song' as 'this' argument of 'std::string mtm::Song::getAutherName()' discards qualifiers [- fpermissive]

为什么要使用basic_string而不是string?如何解决这个问题?


1
std::basic_string<...只是在后台使用的实际内容。错误仍然与您对std::string的使用有关。 - stefan
2
@MarounMaroun - 这是C++,==被重载并允许进行字符串相等比较。 - wkl
@MarounMaroun 这是 C++ 不是 Java。 - Ivaylo Strandjev
1
std::string 只是 std::basic_string<char> 的一个 typedef - cschwan
1
请复制粘贴完整的错误信息,你那里看起来很奇怪。另外 getAutherName() 不是常量,我认为你不能使用那些 Song 引用来调用它。 - Mat
显示剩余6条评论
4个回答

5

你的getAutherName()函数不是const的,因此无法通过const Song&进行调用。将函数声明更改为如下形式:

class Song {

public:
    const string getAutherName() const;
}

1
另外,它可能应该返回const string &。 - Steve
@Steve 取决于字符串是存储还是计算的。有了C++11的移动语义,我更倾向于返回一个string,而不是const string - Angew is no longer proud of SO
我猜它返回的是一个私有成员,所以返回中的副本不能省略(我想)。因此,在这种情况下,引用可能更好。但是,仅使用const string可能是错误的。 - Steve

2

你在const Songs上调用了getAutherName(),因此需要将该方法设置为const

const string getAutherName() const;

不清楚为什么要返回一个const string。可以返回一个string或者返回一个指向string的常量引用:

const string& getAutherName() const;
string getAutherName() const;

1

std::stringbasic_string<char, std::char_traits<char>, std::allocator<char> > 的一个 typedef,编译器只是在错误信息中展开了这个 typedef。

然而,我不知道为什么代码不起作用。你似乎删掉了错误信息中的一部分,其中包含了 '。


有点奇怪,但正如其他人所说,问题在于该方法没有声明为const。 - Steve

0

您需要在getAutherName中添加const限定符,以允许其在const Song对象上调用:

//| -- Returns a `const` `string` (this is bad practice
//v    because it inhibits optimization)
const string getAutherName() const;
// Can be called on a `const`    ^
// `Song`. This is good practice |
// because it it allows `getAutherName()`
// to be used in more places, and it encourages
// const-correctness.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接