我需要在函數中使最後一個參數成爲缺省參數,並且此參數的類型爲*&
(引用指針)。出於某種原因,這並沒有爲我工作:指針引用的缺省值
template<class T>
void f(T*& = nullptr);
我得到一個錯誤:
Error 1 error C2440: 'default argument' : cannot convert from '
nullptr
' to 'T *&
'
如何解決這個問題?
我需要在函數中使最後一個參數成爲缺省參數,並且此參數的類型爲*&
(引用指針)。出於某種原因,這並沒有爲我工作:指針引用的缺省值
template<class T>
void f(T*& = nullptr);
我得到一個錯誤:
Error 1 error C2440: 'default argument' : cannot convert from '
nullptr
' to 'T *&
'
如何解決這個問題?
基本上,如果你需要調用與nullptr
此功能(這意味着「我沒有一個值傳遞給函數,但仍要稱之爲」),那麼你將要採取的參數爲T**
。
更多關於傳遞參數見How to pass objects to functions in C++?。
grazie ...最讚賞。 – 2010-11-13 19:40:12
您有一個指向那裏的指針的l值引用,所以您需要將它默認爲一個l值。由於L值不能nullptr
(這是一個r值),要麼你需要改變功能採取的r值:
template <typename T>
void f(T const* const& = nullptr)
,或者定義一些L值指針所有類型T
。
template <typename T>
struct NullPtr
{
static T const* lvalue = nullptr;
};
template <typename T>
void f(T const*& = NullPtr<T>::lvalue)
但我無法想象任何理由你實際上想要一個l值的默認值。
你的包裝是一個很好的句法思想,但恐怕它不會增加任何語義上的好處。有一個原因爲什麼非const引用不綁定rvalues,尤其是文字,並試圖破解這是毫無意義的:) – 2010-11-13 19:13:59
@Peter謝謝你的回答。你的第二個例子不會爲我工作。我得到一個錯誤:錯誤錯誤C2440:'默認參數':無法從'Nullptr
@Armen:我最好的猜測(假設他*真*想要一個左值)是參數是out參數,當不需要out參數時使用默認參數。在這裏,NullPtr
如果參數是可選的,它需要是一個指針而不是引用。
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
在不帶參數的版本是一個非推斷的上下文,但沒有提供參數時的原始數據也是如此。
謝謝你的回答。它肯定會爲我帶來新的東西。 – 2010-11-13 19:46:11
你不能有一個文字值的引用。 – 2010-11-13 18:56:06
太un un ab ab ab!! – Zeke 2010-11-13 18:57:29