2013-05-19 41 views
0

我正在考慮如何傳遞我的智能指針。將unique_ptr傳遞給非成員函數

我呼籲我的矩陣對象小時功能isIdentity

void test(const size_t dim) 
{ 
    cout << "identity gen: " << "\t\t" << ((h.isIdentity())?"true":"false") << endl; 
} 

這裏是我的矩陣類的相關功能。 它有一個名爲isIdentity的成員函數和一個名爲m的包含實際矩陣的私有數組。

template <typename T> 
class Matrix 
{ 
private: 
    size_t dim; 
    unique_ptr<T[]> m; 

public: 
    explicit Matrix(size_t dim) : dim(dim), m(new T[dim*dim]()) 
    { 
     m = gen_mat<T>(dim); //generates random matrix 
    } 
    Matrix(T* m, size_t dim): dim(dim), m(m){} //copy constructor 
    ~Matrix(){ 
    }; 

    bool isIdentity() 
    { 
     return check_identity<T>(this->m,dim); 
    } 
} 

成員函數調用此非成員函數。

template <typename T> 
bool check_identity(const T *m, size_t dim) 
{ 
    for(size_t i = 0; i < dim; ++i) 
    { 
     for(size_t j = 0; j < dim; ++j) 
     { 
      T r = i == j ? m[i*dim+j] - 1.0 : m[i*dim+j]; 
      if (r < -PRECISION || r > PRECISION) 
      { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

問:

出於某種原因,check_identity功能無法識別。我非常不確定我的方法是否是正確的方法。有人可以向我解釋什麼是錯的,並給出一些關於如何正確使用的指導方針?

如果需要其他信息,請發表評論。

錯誤消息:

error: no matching function for call to ‘check_identity(std::unique_ptr<double [], std::default_delete<double []> >&, size_t&)’ 

回答

3

你的函數採用一個普通的指針。沒有從智能指針到普通指針的隱式轉換。顯式轉換是由成員函數執行的get

return check_identity<T>(this->m.get(),dim); 
          ///^^^^^ 
+0

它很簡單,它幾乎傷害。謝謝 ;) –

相關問題