![]() |
Boost : |
From: Douglas Gregor (doug.gregor_at_[hidden])
Date: 2006-09-28 19:45:14
On Sep 28, 2006, at 6:09 PM, Andy Little wrote:
> The following doesnt work though ( nor with the std:: versions of
> the Concepts)
>
> Output is :
> test.cpp: In function 'T sum(T*, int)':
> test.cpp:28: error: no match for 'operator=' in 'result =
> Addable<T>::operator+(result, array[i])'
> test.cpp:19: note: candidates are: typename Assignable<T>::result_type
> Assignable<T>::operator=(T&, const T&)
Right. Let's take a closer look...
> auto concept Addable<typename T> {
> typename result_type;
> result_type operator+(T x, T y);
> };
This says that you can add two T's with operator+, and the result is
a value of some type result_type (we don't know what that is).
> auto concept Assignable<typename T> {
> typename result_type;
> result_type operator=(T& x, T y);
> };
This says we can assign from a T to a T.
> result = result + array[i];
So, result + array[i] returns a value of type
Addable<T>::result_type. However, there's no requirement on sum that
says that we can assign from an Addable<T>::result_type to a T... we
only say that we can assign from a T to a T! There are a couple ways
to fix this. You could make the Assignable concept take two
parameters (e.g., assign to a T from a U), or you could add a
Convertible constraint that says that the result_type needs to be
convertible to T, e.g.,
std::Convertible<Addable<T>::result_type, T>
I added this to the where clause, and things work as expected.
Doug
Boost list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk