我正在尝试通过使用Eigen::SparseMatrix A初始化malloc

A.valuePtr() = static_cast<T*>(std::malloc(nnz*sizeof(T)));
A.innerIndexPtr() = static_cast<int*>(std::malloc(nnz*sizeof(int)));

但是我得到了错误
error: lvalue required as left operand of assignment

对于两个语句。如果很重要,包含这些行的函数将通过引用获取一个Eigen::SparseMatrix<T, Eigen::RowMajor>

谁能帮我这个?我正在使用g++ 5.2。

编辑:valuePtr类的函数SparseMatrix
inline Scalar* valuePtr() { return &m_data.value(0); }
Scalar是模板参数。 m_dataCompressedStorage类型的 protected 变量,其方法value(size_t i)引用返回到其内部数据数组的第i个成员。
 inline Scalar& value(size_t i) { return m_values[i]; }

因此,我得出结论valuePtr()返回数组的第一个元素的地址。然后,我应该能够通过malloc为该数组分配空间。

如果有人感兴趣,我会提供一个引用链接-请查看84和131之后的行。Eigen3 SparseMatrix class

最佳答案

该问题很可能是由于您尝试将对象分配给方法而引起的!

您的行等于:A.valuePtr() = Sometype_Pointer;A.valuePTR()将调用对象A的Eigen::SparseMatrix::valuePTR方法(函数)。

如果此方法返回一个指针(T* A::valuePtr()),则返回的指针不是您想要的!该方法将返回一个右值;一个右值不是不是A中包含的指针的左值,而是指针的临时副本
您无法直接为其分配任何内容,就像无法触摸电视屏幕上的人一样。

我正在做出一个巨大的假设,即您尝试执行上述操作,除非该方法如下所示,否则这是不可能的:

T ** Eigen::SparseMatrix::valuePTR()
{
    return &T;
}
*A.valuePtr() = static_cast<T*>(std::malloc(nnz*sizeof(T)));

但是,请注意,对于c++对象,使用malloc被认为是非常过时的,像这样的一行会更正确
* A.valuePtr()= static_cast(new T [nnz]));

[编辑/]

老实说,我正在努力理解您的代码应该完成的工作。而且大多数人(包括我自己)都不会对这个“本征”类(class)感到陌生。尽管我认为您可能会非常误解应该如何使用它。

您能否提供到文档的链接,或提供有关如何创建/使用此类的示例?

[编辑2 /]

经过一些研究,我遇到了This articleThis Question,是否可能需要使用MappedSparseMatrix

[编辑3 /]
inline Scalar* valuePtr() { return &m_data.value(0); }将返回一个右值指针。这不是m_data中保存的对象,也不是内部使用的指针。它是指向现有对象的指针的临时副本,试图说“使此临时副本指向其他对象”没有任何意义。
inline Scalar& value(size_t i) { return m_values[i]; }在这种情况下,该方法返回对对象的引用,引用不是指针-(尽管&通常会使人们感到困惑)。
引用可以理解为原始对象,您无需取消引用。考虑以下。
int A;
int * A_p = &A;
int & A_r = A;
int & A_r_2 = *A_p;

//de-reference the pointer (to create a reference)
*A_p = 10;  //A == 10
//Assign directly to A (via the reference)
A_r = 12; // A == 12
//assign directy to A (via the reference to A, that was taken from A_p
A_r_2 = 15; // A == 15
//attempt to de-reference a reference
*A_r = 10; //ERROR, A_r is not a pointer.

简而言之,返回的引用不是指向对象(已经存在)的指针,而是是对象。这将允许您将对象设置为某种对象,或者使用.运算符在该对象上调用方法,但是您无法重新分配已经存在的对象,因此是错误的。

请考虑阅读本文,了解C++ understanding rvalue and lvalue中rvale和lvalue的区别

10-08 12:46