c++ - 结构取消引用运算符(运算符->)

标签 c++ templates iterator operator-overloading

我正在为迭代器编写一个薄的模板包装器,在通过结构取消引用运算符时遇到了绊脚石,主要是因为指针没有:

#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;
}

http://ideone.com/XdvEz

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

最佳答案

标准间接表示重载 operator->必须返回指针、可转换为指针的对象或已重载的对象 operator-> .你最好的选择是只返回 internal .

§13.5.6 [over.ref] p1

An expression x->m is interpreted as (x.operator->())->m

(以上递归适用。)

关于c++ - 结构取消引用运算符(运算符->),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8539004/

相关文章:

c++ - TCHAR 和 WCHAR 有什么区别?

c++ - 100 和 149 之间(包括)的随机数的固定范围

html - 在 JSP 表单中使用 Web 模板

c++ - 在 C++ 编译时计算和打印阶乘

c++ - 捕获可变参数模板类型?

c++ - std::transform 的 lambda(parameter) 中的 const 限定符与 std::sregex_token_iterator

c++ - 没有一个新的内存泄漏 1mb/s

c++ - std::tuple 和 memcpy

c++ - 在字符串中使用删除函数是否会使迭代器无效

c++ - 用于枚举图中所有节点值的伪迭代器操作