[OT] general C++ question

Michael Schwendt mschwendt at gmail.com
Thu Sep 2 10:54:52 UTC 2010


On Thu, 02 Sep 2010 12:15:27 +0200, Christoph wrote:

> Hi all,
> 
> I just learned about closures in the Boost library and wanted to write
> some shorter code. To test, I used the following snippet:
> 
> #include <iostream>
> #include <string>
> 
> #include <boost/function.hpp>
> #include <boost/bind.hpp>
> 
> class FakeVisitor {
> public:
>   virtual void visit(int e) {}
>   virtual void visit(std::string e) = 0;
> };
> 
> template <typename T> class GenericVisitor : public FakeVisitor {
> public:
>   boost::function<void (T e)> f;
>   virtual void visit(T e) { f(e); }
> };
> 
> void print(int a, int i) {
>   std::cout << a << ":" << i << std::endl;
> }
> 
> int main(int argc, char** argv) {
>   GenericVisitor<int> v;
>   v.f = boost::bind(&print, 0, _1);
> 
>   v.visit((int) 1);
>   v.visit(std::string("hallo"));
>   //boost::bind(print, 1, _1)(2);
> }
> 
> Apparently, it does not work. Does anyone know why GenericVisitor<int>
> does not inherit visit(std::string)?

It does, but it's still declared a pure virtual function, i.e.
FakeVisitor (and GenericVisitor, too) is an abstract class that
cannot be instantiated. You would need to declare an implementation
of the visit(std::string) virtual method in GenericVisitor to make
it a non-abstract type.


More information about the users mailing list