Search code examples
c++visual-c++templatesvisual-c++-2008visual-c++-2010

std::make_shared as a default argument does not compile


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()?


Solution

  • 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.