In Visual C++ (2008 and 2010), the following code does not compile with the following error:
#include <memory>
void Foo( std::shared_ptr< int > test = ::std::make_shared< int >( 5 ) )
{
}
class P
{
void
Foo( std::shared_ptr< int > test = ::std::make_shared< int >( 5 ) )
{
}
};
error C2039: 'make_shared' : is not a member of '`global namespace''
error C3861: 'make_shared': identifier not found
It is complaining about the definition of P::Foo() not ::Foo().
Does anybody know why it is valid for Foo() to have a default argument with std::make_shared but not P::Foo()?
It looks like a bug in the compiler. Here is the minimal code required to reproduce the problem:
namespace ns
{
template <typename T>
class test
{
};
template <typename T>
test<T> func()
{
return test<T>();
}
}
// Works:
void f(ns::test<int> = ns::func<int>()) { }
class test2
{
// Doesn't work:
void g(ns::test<int> = ns::func<int>())
{
}
};
Visual C++ 2008 and 2010 both report:
error C2783: '
ns::test<T> ns::func(void)
' : could not deduce template argument for 'T
'
Comeau has no issues with this code.