|
Boost : |
From: Sean Perry (perry_at_[hidden])
Date: 2007-11-22 14:27:14
This code does have the name hiding.overload resolution issues still. Can
you change the call to swap so you use "std::swap(t.x, t.y)" instead of the
using declaration and "swap(t.x,t.y)".
The following compiles for me:
#include <algorithm>
template<typename T>
struct foo
{
T t;
foo():t(0){}
void swap(foo& x){swap(x);}
void swap(foo& x)
{
std::swap(t,x.t);
}
};
template<typename T>
void swap(foo<T>& x,foo<T>& y)
{
x.swap(y);
}
int main()
{
foo<int> x,y;
x.swap(y);
}
-- Sean Perry Compiler Development IBM Canada Lab (905)-413-6031 (tie 313-6031), fax (905)-413-4839 Joaquín Mª López Muñoz <joaquin_at_[hidden]> To Sent by: boost_at_[hidden] boost-bounces_at_lis cc ts.boost.org Subject [boost] 11/22/2007 01:28 Re:[config][vacpp8.0]BOOST_FUNCTION PM _SCOPE_USING_DECLARATION_BREAKS_ADL should be defined? Please respond to boost_at_lists.boost .org "K. Noel Belcourt" ha escrito: > On Nov 22, 2007, at 3:22 AM, Joaquín Mª López Muñoz wrote: > > > Noel, could you please try the following variation of the test snippet, which > > tries to mimic as closely as possible the structure of the failing code? Thank you! > > Okay, here it is. > > > xlC fsudba3.cpp > "fsudba3.cpp", line 12.10: 1540-0256 (S) A parameter of type > "foo<int> &" cannot be initialized with an expression of type "int". > "fsudba3.cpp", line 12.10: 1540-1205 (I) The error occurred while > converting to parameter 1 of "foo<int>::swap(foo<int> &)". > "fsudba3.cpp", line 9.8: 1540-0700 (I) The previous message was > produced while processing "foo<int>::swap_(foo<int> &)". > "fsudba3.cpp", line 8.21: 1540-0700 (I) The previous message was > produced while processing "foo<int>::swap(foo<int> &)". > "fsudba3.cpp", line 25.8: 1540-0700 (I) The previous message was > produced while processing "main()". Ok, so we've got a case again. John, let me re-ask you about what we should do regarding this compiler bug. For your reference, the offending code does not involve name hiding anymore: #include <algorithm> template<typename T> struct foo { T t; foo():t(0){} void swap(foo& x){swap_(x);} void swap_(foo& x) { using std::swap; swap(t,x.t); } }; template<typename T> void swap(foo<T>& x,foo<T>& y) { x.swap(y); } int main() { foo<int> x,y; x.swap(y); } Of course there's no big problem if it's decided that this shouldn't be covered by BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL, but I think the bug qualifies as a reasonable extension for the concept covered by the macro. Joaquín M López Muñoz Telefónica, Investigación y Desarrollo _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk