我需要在我的函数中使最后一个参数成为默认参数,并且该参数的类型是*&
(对指针的引用)。出于某种原因,这对我不起作用:
template<class T>
void f(T*& = nullptr);
我收到了一个错误:
错误1错误C2440:'默认参数':无法从“
nullptr
”转换为“T *&
”
如何解决这个问题?
答案 0 :(得分:3)
如果参数是可选的,则它必须是指针,而不是引用。
template<class T>
void f(T** const = 0);
如果您希望call-style是pass-by-reference,那么您需要一个转发器,而不是默认参数。
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
是一个非推导的上下文,但在没有提供参数的情况下也是如此。
答案 1 :(得分:1)
基本上,如果你需要用nullptr
调用这个函数(这意味着“我没有传递给函数的值,但是想要调用它”) ,那么你想要根据T**
得出参数。
有关传递参数的更多信息,请参阅 How to pass objects to functions in C++? 。
答案 2 :(得分:0)
你有一个指针的l值引用,所以你需要将它默认为l值。由于l值不能是nullptr
(它是一个r值),要么你需要改变函数来取一个r值:
template <typename T>
void f(T const* const& = nullptr)
或者,为所有类型T
定义一些l值指针。
template <typename T>
struct NullPtr
{
static T const* lvalue = nullptr;
};
template <typename T>
void f(T const*& = NullPtr<T>::lvalue)
但是我无法想象你实际上有什么理由希望l值默认为那个。