【发布时间】:2012-01-22 06:22:08
【问题描述】:
我正在为迭代器编写一个瘦模板包装器,在通过结构取消引用运算符时遇到了一个绊脚石,主要是因为指针没有:
#include <vector>
struct mystruct {
int member;
};
template<class iterator>
struct wrap {
typedef typename std::iterator_traits<iterator>::pointer pointer;
iterator internal;
pointer operator->() {return internal.operator->();} //MARK1
};
int main() {
wrap<std::vector<mystruct>::iterator> a;
a->member;
wrap<mystruct*> b;
b->member;
return 0;
}
prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18: instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’
以下方法有效,但我认为不能保证有效。也就是说,如果一个迭代器有一个奇怪的pointer 类型,它与指向value_type 的指针不同。
pointer operator->() {return &*internal;} //MARK3
【问题讨论】:
-
哪个版本的 C++ 有 结构取消引用运算符?
-
为什么是
char*?某处不会有某种Iterator::value_type吗? -
@ThomasMatthews:这就是wikipedia 所说的。 C++ 标准只是称之为
operator->。 -
我不明白你想要返回什么 - 对对象的引用,或迭代器,或指向对象的指针?是的,不要写伪代码,而是最小的、有代表性的代码。
-
模板专业化不是正确的做法吗?
标签: c++ templates iterator operator-overloading