Boost logo

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