gpt4 book ai didi

c++ - 模板的自定义迭代器

转载 作者:行者123 更新时间:2023-11-28 08:12:38 26 4
gpt4 key购买 nike

我目前正在尝试为自定义类构建一个迭代器,但进展并不顺利:我遇到的问题是我的自定义类使用了一个模板,看起来像这样:

template<class T>
class MyClass {
private:
T memberVar;
};

现在,MyClass 基本上是 memberVar 的包装器,目前它是一个 map 或 map 的 map 。现在,我想在另一个类中创建一个迭代器并用它做一些有用的事情,即访问我的 map 或 map 中的 map 中的元素。

我已经尝试从我的 map 转发我的迭代器,当我做类似 typedef T::iterator iterator; 的事情时,这不会在 MyClass 中给我一个错误,但它显然不想要当我想调用 myIterator->first 时对我好一点,因为现在它不再相信我这会起作用。老实说,我惊讶地发现我的 typedef 确实有效。

现在我的问题是:有什么好的方法可以做我想做的事吗?还是我把自己逼到了一个角落?非常感谢!

西蒙

更多信息:

在 ClassA 中,我实例化了一个 ClassB,然后它继承了具有正确类型 T 的 MyClass。然后,在 ClassA 中,我还实例化了一个 ClassC,我引用了 ClassB。现在,错误发生了,当我尝试在 ClassC 中创建 myIterator 并尝试执行 myIterator->first 时。

最佳答案

对于初学者来说,如果你的类模板总是要包装map 的一些实例化,我会重复所有的 typedefstd::map 在你的类中,每次都有:

typedef typename T::value_type;
// ...

(typename 是必需的,至少根据标准,但是g++ 的版本,并用它编译你所有的代码,即使你使用最终构建的不同编译器。)

关于 myIterator->first 不工作,你必须告诉我这条线发生的地方。如果它在在你的类模板中使用函数,因为这个函数不应该是实例化直到它被使用(并且通过该类型, T 的类型是已知)。如果它在类模板之外,它应该仍然有效,如果您已正确声明变量,则类似于:

MyClass<std::map<T1, T2> >::iterator myIterator;

(在类模板中,只需使用 iterator 作为类型名足够了,因为 typedef 在范围内。)

关于c++ - 模板的自定义迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8607271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com