|
Boost Users : |
From: Patrick Mézard (pmezard_at_[hidden])
Date: 2005-03-02 03:22:27
Hello,
I am currently upgrading from boost-1.30.2 to boost-1.32.0 with MSVC 7.1 and I
am running into the following issue:
BOOST_CHECK_EQUAL requires the elements to be compared to provide an operator<<
taking an std::ostream& as first parameter. I always had names lookups problems
with that when the operator was provided by the test and not along with the
element. Until now, I had the operator defined in "boost" namespace (that's
ugly I know) in the test file. It breaks with 1.32.0 because the
problematic function (print_log_value) moved deeped into test tools
namespaces. Then I try to revert to a
normal definition but it does not work either. For instance :
//*******************************
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
namespace testns
{
struct Test
{
Test(std::string const& s_) : s(s_) {}
bool operator==(Test const& t) const
{
return s==t.s;
}
std::string s;
};
namespace
{
std::ostream& operator<<(std::ostream& o, Test const& t)
{
return o<<t.s;
}
void free_test_function()
{
Test t1("test1"), t2("test2");
BOOST_CHECK_EQUAL(t1, t2);
}
} //namespace
} //namespace testns
test_suite*
init_unit_test_suite( int, char* [] ) {
test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" );
test->add( BOOST_TEST_CASE( &testns::free_test_function ));
return test;
}
//***********************
Does not compile and gives me a:
C2679: binary 'operator' : no operator defined which takes a right-hand operand
of type 'const testns::Test' (or there is no acceptable conversion),
the failure being issued by "void
boost::test_tools::tt_detail::print_log_value<T>::operator
()(std::ostream &,const T &)"
However, if I define operator<< as a public member of testns::Test it compiles.
Same thing if I move it outside the anonymous namespace, with or without static
linkage.
Note these workaround do not work or cannot be applied if the type is
declared by a typedef. In this case, I have to define again the
operator in namespace
boost.test_tools.tt_detail.
Is it to be expected ? Is is an ADL issue ? Or something related to
MSVC 7.1 ? What is the proper way to do that ?
Patrick Mézard
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