【发布时间】:2022-01-10 15:09:16
【问题描述】:
我正在尝试在允许读取特定文件格式的库上创建迭代器。
从文档中,要读取文件内容,您需要执行以下操作:
CKMCFile database;
if (!database.OpenForListing(path)) {
std::cerr << "ERROR: unable to open " << path << std::endl;
}
CKMCFileInfo info;
database.Info(info);
CKmerAPI kmer(info.kmer_length);
uint32 cnt;
std::vector<uint64_t> data;
std::vector<uint64> ulong_kmer;
data.reserve(info.total_kmers);
while (database.ReadNextKmer(kmer, cnt)) {
kmer.to_long(ulong_kmer);
data.push_back(ulong_kmer[0]);
}
现在,我从这门课开始wrapper:
class FileWrapper {
CKMCFile database;
CKMCFileInfo info;
Iterator _end;
public:
explicit FileWrapper(const std::string &path) {
if (!database.OpenForListing(path)) {
std::cout << "ERROR: unable to open " << path << std::endl;
}
database.Info(info);
}
Iterator begin() {
Iterator it;
it.database = &database;
it.total = 0;
uint32_t cnt;
std::vector<uint64_t> ulong_kmer;
CKmerAPI tmp(info.kmer_length);
database.ReadNextKmer(tmp, cnt);
tmp.to_long(ulong_kmer);
return it;
}
Iterator end() const { return _end; }
uint64_t size() { return info.total_kmers; }
};
然后,这是Iterator 类:
class Iterator {
friend class FileWrapper;
CKMCFileInfo info;
CKMCFile *database;
uint64_t kmer, total;
public:
Iterator &operator++() {
++total;
uint32_t cnt;
std::vector<uint64_t> ulong_kmer;
CKmerAPI tmp(info.kmer_length);
database->ReadNextKmer(tmp, cnt);
tmp.to_long(ulong_kmer);
return *this;
}
bool operator<(const Iterator &rhs) const { return total < rhs.total; }
uint64_t operator*() const { return kmer; }
};
但是,在某些测试中,我不能将for loop 用于for (auto it = begin(); it != end(); ++i) { ... } 或begin() + size() 之类的东西。我怎样才能正确地超载这两个操作员? opeartor!= 和 operato+
【问题讨论】:
-
您可能会遇到更严重的构建错误问题:您忘记初始化
total,这将导致您在使用它时出现未定义的行为。 -
@Someprogrammerdude 一个编译时间,现在我有这个错误:
error: no match for 'operator!='
标签: c++ iterator c++17 operator-overloading overloading