Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-11-20 14:44:28

Christopher Currie wrote:
> Peter Dimov wrote:
>> This affects bind_test, right?
> That's correct. The reason I suggested the template ordering macro is
> that it's used in the Bind sources as a workaround, and that enabling
> it fixes bind_test, although I suspect it may reduce functionality in
> other areas I'm not aware of.

I'm not sure I understand. The failures that I see here:

are not caused by the problem you reported, as bind_test.cpp does not test
the derived object case (only mem_fn_derived_test does). Apparently the Sun
compiler cannot handle pointers to data members well, selecting the general
overload instead. This would correspond to:

template<class F> void bind(F f);
template<class R, class T> void f(R T::* pm);

struct X { int i; };

int main() { f(&X::i); }

Unfortunately I don't have access to this compiler so I cannot test my
theory. ;-)

>> The problem above is not related to function template ordering; your
>> original example has a single function template, so no ordering is
>> done. The revised example can be viewed as an ordering issue, even
>> though it's not.
> Is there a good description for what this problem is? Your correction of
> my misunderstanding of the function's type lead me to try
> foo( static_cast<int(B::*)()>(&X::f0) );
> which also allows the test case to compile, so perhaps the problem is
> not with templates at all, but with the compiler's type deduction? The
> expression:
> std::cerr << typeid( &X::f0 ).name() << std::endl;
> emits "int(X::*)()", which is why I was misunderstood. Granted the
> result of std::typeinfo::name() is platform-specific, but it does give
> us an idea as to what is going on. However, even the expression:
> assert( typeid( &X::f0 ) == typeid( int(X::*)() ) )
> which, if I understand correctly, should cause the program to assert, is
> run without complaint. So even if the compiler is getting type of the
> expression wrong, shouldn't it be able to find the right template
> instance?

Yes it should, you have found two bugs in the compiler. ;-)

>> But even if we did have a macro for this case, what could we
>> possibly do with it?
> Well, for starters, it could be used to improve the support for Bind on
> the Sun compiler, and might also be necessary to devise other
> workarounds for it.

I don't think that we can do anything about the derived class issue.
mem_fn_derived_test.cpp will still fail, as it should, as the compiler
simply cannot handle the case.

Boost list run by bdawes at, gregod at, cpdaniel at, john at