class Foo
{
public:
void read(int i);
};
void Func(Foo* inFoo);
void Foo::read(int i)
{
i = i + 1;
}
class Baz
{
public:
Baz(Foo* in) : fFoo(in) {}
operator Foo*() { return fFoo; }
Foo *foofoo(void) { return fFoo; }
Foo* fFoo;
};
template <class T> class Boop {
public:
Foo *booboo(void) { return gFoo; }
operator void *(void) { return (void *)gFoo; }
Foo *gFoo;
};
void Func(Foo* inFoo)
{
inFoo->read(1);
}
template <class T> class Bar : public Baz, public Boop <T>
{
public:
Bar(T *inFoo) : Baz(inFoo) {}
void CallMe()
{
void *p;
Func(this->foofoo());
Func(this->operator Foo*());
Func(this->booboo());
p = Boop<T>::operator void*();
Func(foofoo());
Func(operator Foo*());
Func(booboo());
p = operator void *();
}
};
int main (int argc, char * const argv[])
{
Foo theFoo;
Bar<Foo> theBar(&theFoo);
theBar.CallMe();
}