Если аргумент является необязательным, он должен быть указателем, а не ссылкой.
template<class T>
void f(T** const = 0);
Если вы хотите, чтобы стиль вызова передавался по ссылке, то вам нужен сервер пересылки, а не аргумент по умолчанию.
template<class T>
void f_impl(T** const);
template<class T>
void f( T*& arg ) { return f_impl(&arg); }
template<class T>
void f( void ) { return f_impl<T>(0); }
Если вы хотите избежать нулевых проверок и просто отменить присвоение параметру, когда параметр не указан, сделайте следующее:
template<class T>
void f(T*&);
template<class T>
void f( void ) { T* unused = 0; return f(unused); }
Обратите внимание, что T
в версии без аргументов является не выводимым контекстом, но то же самое было и в оригинале, когда не было предоставлено никаких параметров.