我正在尝试创建一个函数,该函数返回最初存储在QStringList
中的QList<company*> list
个公司。当我尝试将项目添加到QStringList
时,我收到以下错误:
C:\Qt\Qt5.3.0\Tools\QtCreator\bin\test\companylist.cpp:13: error: passing 'const QStringList' as 'this' argument of 'QList<T>& QList<T>::operator+=(const T&) [with T = QString]' discards qualifiers [-fpermissive]
m_sortedList += m_companyList.at(i)->toString();
^
知道我做错了什么吗?我也尝试使用m_sortedList.append()
但没有运气......
我的代码:
QStringList CompanyList::getCompanyList() const {
for (int i = 0; i <= m_companyList.length(); ++i) {
m_sortedList += m_companyList.at(i)->toString();
}
m_sortedList.sort();
return m_sortedList;
}
答案 0 :(得分:3)
在getCompanyList() const
内,所有成员都是const。因此,m_sortedList
的类型为const QStringList
,您无法对其进行修改。
但是,没有理由让m_sortedList
成为会员,因为你总是会覆盖它。而且,你似乎永远不会清理它。如果您多次调用(非常量)getCompanyList
,则会获得包含重复条目的列表。
为了避免在增长具有已知大小的列表时过早的悲观化,您应该通过调用reserve
来确保它有足够的空间来容纳足够的元素。
您正在寻找的是典型的本地回报价值成语:
// C++11
QStringList CompanyList::getCompanyList() const {
QStringList result;
result.reserve(m_companyList.size());
for (auto c : m_companyList) result << c->toString();
std::sort(result.begin(), result.end());
return result;
}
// C++03, this is a more declarative style loved by some OSS projects :)
QStringList CompanyList::getCompanyList() const {
QStringList result;
result.reserve(m_companyList.size());
std::transform(c.begin(), c.end(), std::back_inserter(result),
std::mem_fn(&company::toString));
std::sort(result.begin(), result.end());
return result;
}
// C++98
QStringList CompanyList::getCompanyList() const {
QStringList result;
result.reserve(m_companyList.size());
foreach (company * c, m_companyList) result << c->toString(); // or Q_FOREACH
std::sort(result.begin(), result.end());
return result;
}