我在访问和打印存储在multimap中的枚举类的值时遇到了一些问题。我得到的错误是:
错误C2228:'。getFileType'的左边必须有class / struct / union
根据我的理解,我的指针指向枚举类,它无法访问getFileType();功能
我可以做些什么来访问和读取枚举的值(所以我可以在控制台上打印出来)?我的多图对必须像我做的那样。
任何建议都很受欢迎,因为我真的无法用脑子解决这个问题。
谢谢你的时间!
#include <iostream>
#include <string>
#include <map>
#include <utility>
#include <fstream>
using namespace std;
fstream fp;
class CFile {
string m_strFile;
unsigned int m_size;
public:
CFile () { m_strFile = ""; m_size = 0; }
CFile (string name, int size ) { m_strFile = name; m_size = size; }
string getFileName () const { return m_strFile; }
int getFileSize () const { return m_size; }
void setFileSize ( int size ) { m_size = size; }
bool operator< (CFile& obj) {
return ( m_size < obj.m_size );
}
bool operator== (const CFile& obj) {
return ( m_size == obj.m_size );
}
friend ostream& operator<< ( ostream& ost, const CFile& obj ) {
return ost << obj.m_strFile << obj.m_size;
}
friend istream& operator>> ( istream& ist, CFile& obj ) {
return ist >> obj.m_strFile >> obj.m_size;
}
static bool Greater(const CFile& obj1, const CFile& obj2) {
if ( obj1.m_size > obj2.m_size )
return true;
else
return false;
}
};
bool operator< (CFile obj1, CFile obj2) {
return obj1.getFileName()<obj2.getFileName();
}
class CDirectory {
string m_strDirectory;
enum class Filetype {
Archive, Hidden, ReadOnly, System, FileNotSupported
};
Filetype filetype;
multimap <CFile, Filetype> m_DirectoryMap;
public:
Filetype getFileType();
CDirectory (string n) {
fp.open (n, ios::in);
string dirName, fileName, fType;
int fileSize;
fp >> dirName;
m_strDirectory = dirName;
if (fType == "Archive")
filetype = Filetype::Archive;
else if (fType == "Hidden")
filetype = Filetype::Hidden;
else if (fType == "ReadOnly")
filetype = Filetype::ReadOnly;
else if (fType == "System")
filetype = Filetype::System;
else
filetype = Filetype::FileNotSupported;
while (fp >> fileName >> fileSize >> fType) {
CFile obj (fileName, fileSize);
m_DirectoryMap.insert(pair<CFile, Filetype>(CFile(obj.getFileName(), obj.getFileSize()), Filetype(filetype)));
}
multimap<CFile, Filetype>::iterator p = m_DirectoryMap.begin();
while ( p != m_DirectoryMap.end()) {
cout << endl << p->first.getFileName() << '\t' << p->first.getFileName() << '\t' << p->second.getFileType() << endl; // im getting the error here, at p->second.getFileType()
}
}
string getDirectory () { return m_strDirectory; }
};
CDirectory::Filetype CDirectory::getFileType() {
return filetype;
}
int main () {
CDirectory obj("test.txt");
system("pause");
return 0;
}
答案 0 :(得分:1)
如果您想打印p->second
的值,基本上有两种不同的解决方案,具体取决于您实际想要打印的内容。
如果要打印枚举的数字值,可以使用static_cast
,例如
std::cout << static_cast<int>(p->second);
如果要打印字符串或枚举的其他表示形式,则需要重载&#34;输出&#34;运营商<<
。也许是这样的事情
class CDirectory {
...
friend std::ostream& operator<<(std::ostream& os, FileType const type)
{
static std::map<FileType, std::string> const types = {
{ FileType::Archive, "archive" },
{ FileType::Hidden, "hidden" },
{ FileType::ReadOnly, "read-only" },
{ FileType::System, "system" },
{ FileType::FileNotSupported, "not-supported" }
};
return os << types[type];
}
...
};
然后你可以简单地做
std::cout << p->second;
使用switch
代替地图:
friend std::ostream& operator<<(std::ostream& os, FileType const type)
{
switch (type)
{
case FileType::Archive:
os << "archive";
break;
case FileType::Hidden:
os << "hidden";
break;
case FileType::ReadOnly
os << "read-only";
break;
case FileType::System
os << "system";
break;
case FileType::FileNotSupported
os << "not-supported";
break;
}
return os;
}
答案 1 :(得分:0)
p->second.getFileType()
此处访问的地图似乎是:
multimap <CFile, Filetype> m_DirectoryMap;
地图中的第二个组件是Filetype
,它是一个枚举POD。它不是某种实现()
运算符的类或函数。
答案 2 :(得分:0)
根据我的理解,我的指针指向枚举类,它无法访问getFileType();功能
这不是指针。这是一个迭代器。但是,是的,错误确实表明您无法访问getFileType
成员函数。你的枚举没有这样的成员函数,事实上,枚举不能有成员函数。
我可以做些什么来访问和阅读枚举的值
是。对于迭代器,值为p->second
。
(所以我可以在控制台上打印出来)
您需要为operator<<(std::ostream, const FileType&)
定义一个重载,以便将值传递给流。