|
Boost : |
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-01-24 16:55:52
Andy Little wrote:
> "Tobias Schwinger" wrote
>
>>
>>How does the declaration of your operator- look like?
>
>
> Here's operator +. (All operators fail in a similar way )
>
> [...code]
>
Your operator- (in the code of your initial post) is not the problem it must be
the context it's used in.
I got a copy of your lib and comented the workaround and operator- and added
template<typename T0,typename T1> T0 operator-(T0 const &, T1 const &);
and it didn't change anything.
>>Does it instantiate templates that use sizeof- or conditional tricks (as
>>BOOST_TYPEOF_TPL does)?
>
>
> The pqs::meta::binary_operation result_type scheme in the operator+ definition
> above uses SFINAE quite heavily though. I shall try reducing it to a minimal
> example.
SFINAE (at least SFINAE alone) is not the problem, either. I wrote this little
test which compiles fine (it would have been too easy, I guess) ;-(.
namespace user_namespace
{
// some class template
template<typename T> struct t1 { };
// traits to detect its specializations
template<typename T> struct is_t1
{ static bool const value = false; };
template<typename T> struct is_t1<t1<T> >
{ static const bool value = true; };
// another class template
template<typename T> struct t2 { };
// traits to detect its specializations
template<typename T> struct is_t2
{ static bool const value = false; };
template<typename T> struct is_t2<t2<T> >
{ static const bool value = true; };
// tool to create a sfinae condition if the first argument is false
template<bool, typename T> struct enable_if { typedef T type; };
template<typename T> struct enable_if<false,T> { };
// function templates
template<typename T>
typename enable_if<is_t1<T>::value, T >::type outer(t1<T> const & v);
template<typename T>
typename enable_if<is_t2<T>::value, T >::type outer(t1<T> const & v);
template<typename T> t1<T> inner(t1<T> const & v);
}
void func()
{
user_namespace::t1< user_namespace::t1<int> > x;
user_namespace::t1< user_namespace::t2<int> > y;
// 'inner' is found by ADL
outer(inner(x));
outer(inner(y));
}
> Boost.Typeof use in the implementation (for operations on built-in types) is
> optional though I havent tried turning it off yet
BOOST_TYPEOF_TPL in particular messes up ADL for the expression passed to it (the
thread I linked to). Guessing from VC8's extremely strange behaviour in that case
TYPEOF_TPL might act as some sort of "bug attractant"... I'd definitely give it a
try!
Hope it helps,
Tobias
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk