2010-11-13 74 views
4

我需要在函數中使最後一個參數成爲缺省參數,並且此參數的類型爲*&(引用指針)。出於某種原因,這並沒有爲我工作:指針引用的缺省值

template<class T> 
void f(T*& = nullptr); 

我得到一個錯誤:

Error 1 error C2440: 'default argument' : cannot convert from ' nullptr ' to ' T *& '

如何解決這個問題?

+0

你不能有一個文字值的引用。 – 2010-11-13 18:56:06

+4

太un un ab ab ab!! – Zeke 2010-11-13 18:57:29

回答

1

基本上,如果你需要調用與nullptr此功能(這意味着「我沒有一個值傳遞給函數,但仍要稱之爲」),那麼你將要採取的參數爲T**

更多關於傳遞參數見How to pass objects to functions in C++?

+0

grazie ...最讚賞。 – 2010-11-13 19:40:12

0

您有一個指向那裏的指針的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值的默認值。

+0

你的包裝是一個很好的句法思想,但恐怕它不會增加任何語義上的好處。有一個原因爲什麼非const引用不綁定rvalues,尤其是文字,並試圖破解這是毫無意義的:) – 2010-11-13 19:13:59

+0

@Peter謝謝你的回答。你的第二個例子不會爲我工作。我得到一個錯誤:錯誤錯誤C2440:'默認參數':無法從'Nullptr ::值'轉換爲'int *&' – 2010-11-13 19:16:07

+0

@Armen:我最好的猜測(假設他*真*想要一個左值)是參數是out參數,當不需要out參數時使用默認參數。在這裏,NullPtr ::左值充當輸出參數的「匯」。 – 2010-11-13 19:19:03

3

如果參數是可選的,它需要是一個指針而不是引用。

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在不帶參數的版本是一個非推斷的上下文,但沒有提供參數時的原始數據也是如此。

+0

謝謝你的回答。它肯定會爲我帶來新的東西。 – 2010-11-13 19:46:11