If the type is declared by a typedef:
typedef foo::C C2;
you can define the operator<< in the 'foo' namespace, and that should work.
That is very unfortunate. Is there no way to have the operator<< lookup occur in the scope of the call to BOOST_CHECK_EQUAL, by moving the wrap_stringstream logic and the call to operator<< into the macro itself ?
No. there are several reasons why it couldn't be done: 1. Printing log value in the scope of call would cause multiple value evaluation. Imagine what if I write BOOST_CHECK_EQUAL( i++, 2 ); 2. I need extra level of indirection to be able to prevent value from being printed (BOOST_TEST_DONT_PRINT_LOG_VALUE(type)) 3. I need extra level of indirection to be able to do custom printing for some types You have several choices 1. You could define operator<< in namespace foo 2. You could use BOOST_TEST_DONT_PRINT_LOG_VALUE(your type) on global scope to prevent values of this type being printed at all 3. You could write struct C2 : foo::C {}; And unless you use non-default constructor it will work. Gennadiy