Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-10-31 09:17:07

From: <helmut.zeisel_at_[hidden]>
> I want to specialize numeric_cast for a user definied class.
> GCC 3.0.1 compiles the following code,

GCC sees a different version of the code.

> Visual C++ 6.0 says
> example_numeric_cast.cpp(20) : error C2572: 'numeric_cast' :
> redefinition of default parameter : parameter 2
> example_numeric_cast.cpp(19) : see declaration of 'numeric_cast'
> Is the code correct?

This minimal example:

template<class T> void f(T = 0);
template<> void f(int = 0);

is not accepted by the online Comeau:

"11110.c", line 2: error: default argument is not allowed
  template<> void f(int = 0);

> If yes, what is a suitable work around for VC++?

The best workaround is to remove BOOST_EXPLICIT_TARGET from cast.hpp
altogether. MSVC 6 (latest SP) has no problems with the following:

#include <iostream>
#include <typeinfo>

template<typename Target, typename Source> inline Target numeric_cast(Source
 std::cout << "numeric_cast<" << typeid(Target).name() << ">(" <<
typeid(arg).name() << ")\n";
 return Target(arg);

int main()

BOOST_EXPLICIT_TARGET-type workarounds are only needed when the template
parameter is not referenced at all, even in the return type.

Peter Dimov
Multi Media Ltd.

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