所以我目前正在开发一个so和dll文件来处理我的用户文件(基本上是一个文件系统)。 我有两个类,一个是 FileData (代表一个文件),另一个是 FileList (顾名思义就是FileDatas列表)。这是我的问题。我的代码正在运行,但我需要实现一个基于我在文件中获取的元数据的排序方法,为此我需要将我的getter用于 const方法 :
我正在使用标志进行编译 -Wextra -Wall -Werror
FileData.hpp
class FileData
{
// ...
std::vector<std::pair<std::string, std::string> > _metadatas;
public:
FileData(std::string);
~FileData();
FileData(const FileData &);
std::vector<std::pair<std::string, std::string> > &getMetadatas() const;
};
FileData.cpp (我试图同时返回(_metadatas)和(&amp; _metadatas)都失败了)
std::vector<std::pair<std::string, std::string> > &FileData::getMetadatas() const
{
return (_metadatas);
}
以下是错误消息:
FileData.cpp: In member function ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >& FileData::getMetadatas() const’:
FileData.cpp:164:23: error: invalid initialization of reference of type ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >&’ from expression of type ‘const std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >’
return (_metadatas);
^
make: *** [FileData.o] Error 1
这就是我的FileList.cpp中的原因我需要让getMetadatas成为一个const getter(尽管我知道getter总是应该是const):
FileList.cpp
bool SortMetadata::sortArtist(const FileData &a, const FileData &b)
{
int i,j;
std::vector<std::pair<std::string, std::string> > tmp, temp;
tmp = a.getMetadatas();
temp = b.getMetadatas();
std::string first("");
std::string second("");
for (i = 0; i < tmp.size(); ++i)
{
if (tmp[i].first.compare("artist") == 0)
first = tmp[i].second;
}
for (j = 0; j < temp.size(); ++j)
{
if (temp[j].first.compare("artist") == 0)
second = temp[j].second;
}
return (first.compare(second) < 0);
}
如果我没有让我的getMetadatas()成为const方法,那么这是错误消息:
FileList.cpp: In function ‘bool SortMetadata::sortArtist(const FileData&, const FileData&)’:
FileList.cpp:91:26: error: passing ‘const FileData’ as ‘this’ argument of ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >& FileData::getMetadatas()’ discards qualifiers [-fpermissive]
tmp = a.getMetadatas();
^
FileList.cpp:92:27: error: passing ‘const FileData’ as ‘this’ argument of ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >& FileData::getMetadatas()’ discards qualifiers [-fpermissive]
temp = b.getMetadatas();
我不确定这里的问题是什么,因为代码在我将getter改为const之前工作正常,而且我不明白它变为const的是什么,因为方法只是一个回报.. 感谢帮助人员!
答案 0 :(得分:0)
您无法从const
getter 1 返回对非const
成员的引用。您可以有两个重载(const
和非 - const
):
std::vector<std::pair<std::string, std::string> > & getMetadatas();
std::vector<std::pair<std::string, std::string> > const& getMetadatas() const;
但我认为您甚至不想要第一次重载,而您只是忘记了返回类型中的一个const
。
正如@ M.M注意到的那样,在返回引用时不使用address-of运算符:
return _metadatas;
(1)这是因为如果可能的话,你会使用以下代码违反const-correctness:
const FileData fd;
fd.getMetadatas() = {}; // you're modifying a const object