我想实现的*以及 - 一个特制的容器的迭代器>运营商。我的代码不能编译。下面以一个“极小非工作示例”,这表明它与标准::地图,但不是在我的代码工作。
#include <vector>
#include <map>
#include <iostream>
struct thing {
float f[1];
typedef std::pair<int,float> key_data;
struct iterator {
int pos;
const float *f;
key_data operator*() const { return key_data(pos,f[pos]); }
key_data *operator->() const { return &key_data(pos,f[pos]); }
};
iterator begin() const { return {.f = f, .pos = 0}; }
};
template<typename T> void test(T iter) {
(*iter).second = 1.0; std::cout << (*iter).second;
iter->second = 2.0; std::cout << iter->second;
}
int main() {
std::map<int,float> fmap; fmap[0] = 0.0;
test(fmap.begin());
std::cout << fmap[0];
thing f;
test(f.begin());
std::cout << f.f[0];
}
我想这个编译:),并打印122122
。在编译错误消息是:
access.cc:13:43: error: taking the address of a temporary object of type 'key_data'
(aka 'pair<int, float>') [-Waddress-of-temporary]
key_data *operator->() const { return &key_data(pos,f[pos]); }
access.cc:20:18: error: expression is not assignable
(*iter).second = 1.0; std::cout << (*iter).second;
对于第一个:不够公平,性病::对<>创建一个临时不能由参考被返回;但如何在标准库这样做是为了让往常一样 - >语法?
对于第二:可能会再次我想分配到一个临时的,但我不能猜测正确的语法是什么。
更简单的是要有正确的直接型迭代器:
struct thing {
float f[1];
using key_data = std::pair<int,float&>;
struct iterator {
key_data data;
const key_data& operator*() { return data; }
key_data *operator->() { return &data; }
};
iterator begin() { return {{0, f[0] }}; }
};
另一个解决方案是有包装,是这样的:
struct pair_wrapper
{
int &first;
float& second;
pair_wrapper* operator->() { return this; }
};
struct thing {
float f[1];
typedef std::pair<int,float> key_data;
struct iterator {
int pos;
float *f;
pair_wrapper operator*() { return pair_wrapper{pos,f[pos]}; }
pair_wrapper operator->() { return pair_wrapper{pos,f[pos]}; }
};
iterator begin() { return {0, f}; }
};
它采用operator->
的“神奇”的链接。