
Hi all. I'm having difficulty understanding why the code listed below is not compiling (at least not on my box, gcc-4.3.2 / boost 1.38). (the code has been stripped and simplified for demonstration). Context: I have an interface and a model providing an implementation of this interface. I use a concept to make sure that the model provides a member function "foo" of a specific signature (whether doind it this way is useful or not, is not the point). In the example below, the member function "foo" should accept one parameter. This parameter should be of type "boost::fusion::sequence_base<SequenceT> const&". Except, when compiling the compiler informs me: invalid use of incomplete type ‘struct boost::fusion::extension::begin_impl<boost::fusion::non_fusion_tag>::apply<const boost::fusion::sequence_base<boost::fusion::list<int, int, int, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >’ Without the concept check in the interface class this compiles fine. Appreciating all your comments on this. Regards, Pieter. ======================main.cpp================================= #include <boost/concept/usage.hpp> #include <boost/concept/requires.hpp> #include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/container/generation.hpp> // simplified concept that requires from the model a member function 'foo' taking in a fusion:sequence_base template<class Model, typename SequenceT> struct concept { template <void (Model::*) (boost::fusion::sequence_base<SequenceT> const&) const> void model_requires_foo(); BOOST_CONCEPT_USAGE(concept) { model_requires_foo<&Model::foo>(); } }; // an interface which gives 'foo' taking in sequences template<class Model> class interface { public: template<typename SequenceT> BOOST_CONCEPT_REQUIRES( ((concept<Model, SequenceT>)), (void)) foo(SequenceT const& c) const { model_.foo(c); } private: Model model_; }; // a model that can handle fusion::sequence_base class model { public: template<typename SequenceT> void foo(boost::fusion::sequence_base<SequenceT> const& b) const { SequenceT const& sequence = b.derived(); } }; int main() { interface<model> bar; bar.foo(boost::fusion::make_list(1,2,3)); }; ==================end main.cpp==============================