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);
} ///:~
Ich habe nicht ganz verstanden, warum Compiler über iterator
hier beschweren. Da dieser Code-Snippet implementiert eine Klasse SequenceWithApply
basierend auf der Vorlage. In diesem Fall ist SequenceWithApply
tatsächlich eine Basisklasse von vector
. Iterator sollte in dieser Basisklasse sichtbar sein. Ich schätze wirklich, dass mir jemand helfen kann, dies herauszufinden.Vorlage Vererbung C++ Iterator
Ich weiß, es gibt eine Betrogene irgendwo da draußen, aber 'Typname Seq :: iterator'. –
chris
Es ist nicht nur 'Iterator', sondern auch' begin() 'und' end() '. Ich habe keine Ahnung, warum das nicht funktioniert. :( – zhexuany
Wenn ich einen Betrogenen finden könnte, würde es erklären, dass diese Namen nachgeschlagen werden, bevor das Template instanziiert wird, was bedeutet, dass es nicht wissen kann, welcher konkrete Basistyp nachzuschauen ist. – chris