将参数传递给构造函数会导致错误

时间:2015-09-11 12:20:25

标签: c++ vector

我有一个构造函数构造一个矩阵,由2D矢量,行和列编号表示。

Matrix(const vector<vector<T> >* vect, const size_t rows, const size_t cols) :
matrix(&vect), matrixRows(rows), matrixCols(cols){}

我想在我的一个函数中找到矩阵的转置。

Matrix& trans() const
{
    vector<vector<T> > trans(matrixCols, vector<T>(matrixRows));
    for(unsigned int i = 0; i < matrixRows; i++)
    {
        for(unsigned int j = 0; j < matrixCols; j++)
        {
            trans[j][i] = matrix[i][j];
        }
    }
    return Matrix(&trans, matrixCols, matrixRows);
}

最后一行导致错误,因为以这种方式传递向量是错误的。 什么是正确的方法? 完整错误:

    Multiple markers at this line
    - invalid initialization of non-const reference of type 'Matrix<Complex>&' from an rvalue of type 
     'Matrix<Complex>'
    - required from 'Matrix<T>& Matrix<T>::trans() const [with T = int]'
    - invalid initialization of non-const reference of type 'Matrix<double>&' from an rvalue of type 
     'Matrix<double>'
    - invalid initialization of non-const reference of type 'Matrix<int>&' from an rvalue of type 'Matrix<int>'
    - required from 'Matrix<T>& Matrix<T>::trans() const [with T = Complex]'
    - required from 'Matrix<T>& Matrix<T>::trans() const [with T = double]'

构造函数错误:

Multiple markers at this line
    - invalid conversion from 'const std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >**' to 'std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::size_type 
     {aka long long unsigned int}' [-fpermissive]
    - candidate expects 3 arguments, 1 provided
    - no matching function for call to 'std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::vector(const std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > 
     >**)'
    - no known conversion for argument 1 from 'std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >' to 'const std::vector<std::vector<double, std::allocator<double> >, 
     std::allocator<std::vector<double, std::allocator<double> > > >*'
    - candidate: Matrix<T>::Matrix(const std::vector<std::vector<T> >*, size_t, size_t) [with T = double; size_t = long long unsigned int]
    - no known conversion for argument 1 from 'std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >' to 'const std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> 
     > > >*'
    - candidate: Matrix<T>::Matrix(const std::vector<std::vector<T> >*, size_t, size_t) [with T = int; size_t = long long unsigned int]
    - no matching function for call to 'std::vector<std::vector<Complex, std::allocator<Complex> >, std::allocator<std::vector<Complex, std::allocator<Complex> > > >::vector(const std::vector<std::vector<Complex, std::allocator<Complex> >, 
     std::allocator<std::vector<Complex, std::allocator<Complex> > > >**)'
    - invalid conversion from 'const std::vector<std::vector<Complex, std::allocator<Complex> >, std::allocator<std::vector<Complex, std::allocator<Complex> > > >**' to 'std::vector<std::vector<Complex, std::allocator<Complex> >, 
     std::allocator<std::vector<Complex, std::allocator<Complex> > > >::size_type {aka long long unsigned int}' [-fpermissive]
    - no matching function for call to 'std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::vector(const std::vector<std::vector<double, std::allocator<double> >, 
     std::allocator<std::vector<double, std::allocator<double> > > >**)'
    - invalid conversion from 'const std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >**' to 'std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, 
     std::allocator<double> > > >::size_type {aka long long unsigned int}' [-fpermissive]
    - no known conversion for argument 1 from 'std::vector<std::vector<Complex, std::allocator<Complex> >, std::allocator<std::vector<Complex, std::allocator<Complex> > > >' to 'const std::vector<std::vector<Complex, std::allocator<Complex> >, 
     std::allocator<std::vector<Complex, std::allocator<Complex> > > >*'
    - candidate: Matrix<T>::Matrix(const std::vector<std::vector<T> >*, size_t, size_t) [with T = Complex; size_t = long long unsigned int]

1 个答案:

答案 0 :(得分:1)

首先,您可能希望Matrix构造函数通过引用而不是地址来获取向量:

Matrix(const vector<vector<T>>& vect, const size_t rows, const size_t cols)
 : matrix(vect), matrixRows(rows), matrixCols(cols)
{
}

(请注意,这会导致向量被复制到matrix。根据向量的大小,这可能没问题 - 这实际上取决于程序的性能要求。)

其次,trans()不应该返回对Matrix的引用。由于您返回的是本地的值,因此当执行离开函数时,该变量将被销毁,因此调用者无法使用它。

结合上面对Matrix构造函数的更改,trans()现在应该编译:

Matrix trans() const
{
    vector<vector<T>> trans(matrixCols, vector<T>(matrixRows));
    for(unsigned int i = 0; i < matrixRows; i++)
    {
        for(unsigned int j = 0; j < matrixCols; j++)
        {
            trans[j][i] = matrix[i][j];
        }
    }
    return Matrix(trans, matrixCols, matrixRows);
}