2016-02-09 78 views
0

我是模板編碼的初學者,並且無法在模板中定義構造函數,只是查找有關該問題的答案,但無法找到相關問題。在模板中定義複製構造函數

基本上類/結構xpair類似於pair它有firstsecond

template <typename First, typename Second> 
struct xpair { 
    First first{}; 
    Second second{}; 

    xpair(){} 
    xpair (const First& first, const Second& second): 
       first(first), second(second) {} 

    xpair& operator() (const First& first_, const Second& second_) { 
     return new xpair (first_, second_); 
    } 

    xpair& operator= (const xpair& that) { 
     return new xpair (that.first, that.second); 
    } 
}; 

當我試着寫類似

xpair<string, string> a, b; 
a = b; 

它給誤差

non-const lvalue reference to type 
'xpair<std::__1::basic_string<char>, std::__1::basic_string<char> >' 
cannot bind to a temporary of type 'xpair<std::__1::basic_string<char>, 
std::__1::basic_string<char> > *' 

我試圖重寫

return new xpair (that.first, that.second); 

return new pair (const_cast<First&>(that.first), const_cast<First&>(that.second)); 

但它不起作用。問題在哪裏?

回答

4

刪除new。這不是Java!

在C++中,new是動態分配(計算指針)的關鍵字,您不使用它。

您還必須重新考慮您的引用返回語義,因爲您將返回對局部變量的引用。這使得懸掛參考。

事實上,你的語義對我來說整體看起來很奇怪。例如,operator=爲什麼不實際修改分配給的對象?您應該從that*this的成員進行分配,然後返回對*this(或至少返回void)的引用。

我不知道你的operator()應該做什麼—應該是一個構造函數嗎?嗯,不,你已經有一個...... :(

我強烈建議考慮看看運營商的一些例子重載更好地瞭解不僅是C++的構造和約束,也是我們的成語和首選語義。