Getter 有效,但 returns 当我将其转换为 const 时出现错误
Getter worked but returns an error when i turn it into a const
所以我目前正在开发一个 so 和一个 dll 文件来处理我的用户的文件(基本上是一个文件系统)。
我有两个类,一个是FileData(代表一个文件),还有一个FileList(顾名思义就是一个文件数据列表)。这是我的问题。我的 代码可以正常工作 ,但我需要根据我在文件中获得的元数据实施排序方法,为此我需要将我的 getter 转换为 常量方法 :
我正在使用标志 -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(我试过 return (_metadatas) 和 (&_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 成为常量 getter(尽管我知道 getters 应该始终是常量):
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 是什么,因为方法是只是一个 return..
感谢大家的帮助!
您不能 return 从 const
getter1[=32= 引用非 const
成员].你可以有两个重载(const
和非 const
):
std::vector<std::pair<std::string, std::string> > & getMetadatas();
std::vector<std::pair<std::string, std::string> > const& getMetadatas() const;
但我认为您甚至不想要第一个重载,您只是忘记了 return 类型中的一个 const
。
正如@M.M 所注意到的,在 return 引用时不使用地址运算符:
return _metadatas;
(1) 这是因为如果可能的话,您会使用以下代码违反常量正确性:
const FileData fd;
fd.getMetadatas() = {}; // you're modifying a const object
所以我目前正在开发一个 so 和一个 dll 文件来处理我的用户的文件(基本上是一个文件系统)。 我有两个类,一个是FileData(代表一个文件),还有一个FileList(顾名思义就是一个文件数据列表)。这是我的问题。我的 代码可以正常工作 ,但我需要根据我在文件中获得的元数据实施排序方法,为此我需要将我的 getter 转换为 常量方法 :
我正在使用标志 -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(我试过 return (_metadatas) 和 (&_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 成为常量 getter(尽管我知道 getters 应该始终是常量):
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 是什么,因为方法是只是一个 return.. 感谢大家的帮助!
您不能 return 从
const
getter1[=32= 引用非const
成员].你可以有两个重载(const
和非const
):std::vector<std::pair<std::string, std::string> > & getMetadatas(); std::vector<std::pair<std::string, std::string> > const& getMetadatas() const;
但我认为您甚至不想要第一个重载,您只是忘记了 return 类型中的一个
const
。正如@M.M 所注意到的,在 return 引用时不使用地址运算符:
return _metadatas;
(1) 这是因为如果可能的话,您会使用以下代码违反常量正确性:
const FileData fd;
fd.getMetadatas() = {}; // you're modifying a const object