2017-08-15 24 views
2

我的類有具有相同名稱的兩個函數和以下簽名:C++函數名含糊

Mat<T, rows, cols> & transpose() 
{ 
    for (size_t i = 0; i < rows; ++i) { 
     for (size_t j = i + 1; j < cols; ++j) { 
      std::swap(at(i, j), at(j, i)); 
     } 
    } 
    return *this; 
} 

此方法不執行該矩陣的就地轉置。現在,我有另一個功能,保留原始矩陣不變,並在新矩陣中進行轉置。簽名是:

Mat<T, cols, rows> transpose() const 

請注意,列和行被交換。

現在,我叫它爲:

Mat<int, 3, 4> d; 
// Fill this matrix 
Mat<int, 4, 3> e = d.transpose(); 

這仍然試圖調用的第一個方法。如果我將第二種方法重命名爲transpose2並稱之爲,那就沒問題。有沒有辦法讓這兩個函數模糊不清?

+0

你爲什麼不把它叫做'換位'? – LogicStuff

+4

聲明'd'一個'const':'mat const d;' –

+1

那時候當我重新學習C++的時候(比如你在做顯然),我讓其中一個是靜態的,另一個是方法;或者,我調用一個'getTranspose()'和另一個'transpose()'。 –

回答

7

overload resolution不依賴於返回值,它由哪個函數的參數與參數最接近匹配來確定。您必須使被調用的對象爲const,才能使const成員函數的超載被調用。例如

Mat<int, 4, 3> e = const_cast<const Mat<int, 3, 4>&>(d).transpose(); 
+0

這可以通過'static_cast'完成。 – LogicStuff

+2

@LogicStuff是的。但是'const_cast'不應該在這裏更適合嗎?因爲它與'const'有關。 – songyuanyao

+0

它在[這裏]討論(https://stackoverflow.com/questions/20956757/using-const-cast-to-add-const-ness-bad-idea)。然而,這取決於程序員。有些人可能習慣看到'const_cast'僅用於刪除cv-qualifiers,有些則不然。 – LogicStuff