迭代器C++模板继承
template inheritance C++ iterator
template<class T, template<typename> class Seq>
class SequenceWithApply : public Seq<T*>
{
public:
// 0 arguments, any type of return value:
template<class R>
void apply(R (T::*f)()) {
iterator it = begin();
while(it != end()) {
((*it)->*f)();
it++; }
}
// 1 argument, any type of return value:
template<class R, class A>
void apply(R(T::*f)(A), A a) {
iterator it = begin();
while(it != end()) {
((*it)->*f)(a);
it++; }
}
// 2 arguments, any type of return value:
template<class R, class A1, class A2>
void apply(R(T::*f)(A1, A2),
A1 a1, A2 a2) {
iterator it = begin();
while(it != end()) {
((*it)->*f)(a1, a2);
it++;
}
}
}; ///:~
//: C03:applyGromit2.cpp
// Test applyMember.h
#include "Gromit.h"
#include "applyMember.h"
#include <vector>
#include <iostream>
using namespace std;
int main() {
SequenceWithApply<Gromit, vector> dogs;
for(int i = 0; i < 5; i++)
dogs.push_back(new Gromit(i));
dogs.apply(&Gromit::speak, 1);
dogs.apply(&Gromit::eat, 2.0f);
dogs.apply(&Gromit::sleep, 'z', 3.0);
dogs.apply(&Gromit::sit);
} ///:~
我不太明白为什么编译器在这里抱怨iterator
。由于此代码段代码实现了基于模板的类SequenceWithApply
。在这种情况下, SequenceWithApply
实际上是一个基于vector
类。迭代器在此基类中应该是可见的。我真的很感激有人可以帮助我解决这个问题。
编译器
在第一阶段查找中查找iterator
,即在模板实例化之前。为了知道类从哪个类型派生,必须实例化模板(以便Seq<T*>
是实际类型(。因此,编译器永远不会在基类中找到iterator
。
您可以通过两种简单的方法解决此问题:
一次性:
typename Seq<T*>::iterator
派生类中的类型别名:
using iterator = typename Seq<T*>::iterator;
所有这些都明确指定iterator
属于哪种类型,当Seq
和T
已知时,在查找的第二阶段查找。更多关于typename
的信息。
您可以对函数执行相同的操作:
一次性:
Seq<T*>::begin()
this->begin() // if inside a member function
使用 声明:
using Seq<T*>::begin;
您正在使用的图书可能已过期。如今,c++已经朝着使用自由函数来更好地解耦的方向发展。
例:
#include <vector>
#include <iostream>
// an example Gromit
struct Gromit
{
Gromit(int index) : index(index) {};
void speak(int i) { std::cout << name() << " speaking " << i << std::endl; }
void eat(float f) { std::cout << name() << " eating " << f << std::endl; }
void sleep(char c, double f) { std::cout << name() << " sleeping " << c << " " << f << std::endl; }
void sit() { std::cout << name() << " sitting" << std::endl; }
private:
std::string name() const {
return "Gromit " + std::to_string(index);
}
int index;
};
// apply some function object to each item in a container
template<class Container, class F>
void apply(Container& container, F f)
{
for (const auto& p : container)
{
f(p);
}
}
int main() {
std::vector<std::unique_ptr<Gromit>> dogs;
for(int i = 0; i < 5; i++)
dogs.emplace_back(new Gromit(i));
using namespace std::placeholders;
// apply dog.speak(1) to each dog in dogs...
apply(dogs, std::bind(&Gromit::speak, _1, 1));
// dog.eat(2.0f) for each dog in dogs...
apply(dogs, std::bind(&Gromit::eat, _1, 2.0f));
// ...etc
apply(dogs, std::bind(&Gromit::sleep, _1, 'z', 3.0));
apply(dogs, std::bind(&Gromit::sit, _1));
}
预期输出:
Gromit 0 speaking 1
Gromit 1 speaking 1
Gromit 2 speaking 1
Gromit 3 speaking 1
Gromit 4 speaking 1
Gromit 0 eating 2
Gromit 1 eating 2
Gromit 2 eating 2
Gromit 3 eating 2
Gromit 4 eating 2
Gromit 0 sleeping z 3
Gromit 1 sleeping z 3
Gromit 2 sleeping z 3
Gromit 3 sleeping z 3
Gromit 4 sleeping z 3
Gromit 0 sitting
Gromit 1 sitting
Gromit 2 sitting
Gromit 3 sitting
Gromit 4 sitting
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象