Am Donnerstag, den 02.09.2010, 12:54 +0200 schrieb Michael Schwendt: > 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. Ah, sorry, wrong snippet. It does not work with virtual void visit(std::string e) {} in FakeVisitor. The intention is to extend a visitor pattern with a templated class that overloads exactly one method.
Attachment:
signature.asc
Description: This is a digitally signed message part
-- users mailing list users@xxxxxxxxxxxxxxxxxxxxxxx To unsubscribe or change subscription options: https://admin.fedoraproject.org/mailman/listinfo/users Guidelines: http://fedoraproject.org/wiki/Mailing_list_guidelines