Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2007-10-15 15:52:11


on Fri Oct 12 2007, "chun ping wang" <cablepuff-AT-gmail.com> wrote:

> namespace boost
> {
> template <class T, class U>
> char (& is_op_test(boost::operators<T,U> const&) )[2];
>
> template <class T>
> char is_op_test(T const&);
>
> template<class T>
> T const& make();
>
> template <class T>
> struct is_operators
> : boost::mpl::bool_<(sizeof(is_op_test(make<T>())) == 2)>
> {};
> }

You should not be creating definitions in namespace boost. Also,
I'll advise against checking for derivation from operators<T,U>;
There's probably a much better way to do what you are trying to do,
whatever it is.

> and this function declaration.
> template <typename T,
> template <typename ELEM, typename = std::allocator<ELEM> >
> class CONT
>>
> typename boost::enable_if<boost::mpl::or_<boost::is_integral<T>, boost:: is_operators<T> >, CONT
> <T> >::type
> primelist(const T& MAX_BOUND, const T& K, boost::function<bool(const T&, const T&)> f);
>
> BigInteger class declaration looks like this..
>
> class BigInteger : public BigUnsigned, boost::operators<BigInteger>,
> boost::operators<BigInteger, int>
> {
> };
>
> I compile with T = int and it works.
>
> When i compile with T = BigInteger I get the following errors.
>
> on visual c++.
> error C2770: invalid explicit template argument(s) for 'boost::enable_if<boost::mpl::or_
> <boost::is_integral<T>,boost::is_operators<T> >,CONT<T>>::type primelist(const T &,const T
> &,boost::function<bool(const T &,const T &)>)'
> ./cs512/c++/primeMain.cpp(24) : see declaration of 'primelist'"
>
> on mingw dev-cpp i get this error.
> unable to find function....
>
> In both cases passing BigInteger does not work.

You haven't shown the call that produces the error, and you haven't
shown the full error.

I suggest reducing your problem to a *minimal* complete example (one
.cpp file) and posting that.

The most obvious problem you have is that instantiating
is_operator<BigInteger> is likely to cause an overloading ambiguity
because BigInteger is derived from two different operator<T,U>
specializations.

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net