将unique_ptr传递给非成员函数

时间:2013-05-19 11:21:34

标签: debugging c++11 unique-ptr

我正在告诉我们如何传递我的智能指针。

我在矩阵对象h上调用函数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&)’

1 个答案:

答案 0 :(得分:3)

你的函数采用普通指针。没有从智能指针到普通指针的隐式转换。显式转换由成员函数get

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