Я столкнулся с той же проблемой в моем собственном коде. Минимальный код, к которому я его сводил, был таким:
namespace N
{
template<typename T>
T defaultValue()
{
return T();
}
template<typename T>
void fun( const T& value = N::defaultValue<T>() ){}
}
int main(int argc, char* argv[])
{
N::fun<int>();
return 0;
}
Это немного отличается от примера Джеймса Макнеллиса - и, я думаю, подчеркивает тот факт, что это квалификация пространства имен в инициализаторе аргумента по умолчанию, где что-то идет не так.
В этом случае defaultValue и fun находятся в одном и том же пространстве имен, поэтому вы можете тривиально удалить N:: из N::defaultValue, и это сработает.
Если defaultValue находится в другом пространстве имен, вы все равно можете обойти его, либо перенеся его в локальное пространство имен с помощью, либо написав функцию локального шаблона пересылки, например:
namespace N1
{
template<typename T>
T defaultValue()
{
return T();
}
}
namespace N2
{
template<typename T>
T defaultValueFwd()
{
return N1::defaultValue<T>();
}
template<typename T>
void fun( const T& value = defaultValueFwd<T>() ){}
}
int main(int argc, char* argv[])
{
N2::fun<int>();
return 0;
}
Немного больно, но можно. Я считаю, что вы могли бы использовать эту технику в случае с make_shared, хотя я не пробовал.
person
philsquared
schedule
06.05.2011
shared_ptr
находится вstd::tr1
, аmake_shared
не реализовано (make_shared
не было частью TR1). - person James McNellis   schedule 07.05.2010::make_shared
- person Johannes Schaub - litb   schedule 07.05.2010boost::shared_ptr
, и он не будет компилироваться в VS2008. Он жалуется, что не может вывести аргумент шаблона для «T», что для меня не имеет никакого смысла, потому что вы явно указываете T (int
). - person James McNellis   schedule 07.05.2010