error: request for member ‘end’ in .... which is of non-class type ‘double’

error: request for member ‘end’ in .... which is of non-class type ‘double’

我收到以下错误,我怀疑它与类型不匹配或其他原因有关....函数中使用的 magnitude_ 变量是声明为指针的双精度数组(例如 double *magnitude_ ;) 在函数中我试图获取双数组的开始和结束,但它似乎不起作用..我也试过

for (auto iter = std::begin(magnitude_); iter != std::end(magnitude_); ++iter)

不过好像不行。有人可以就此给我建议吗?:

EuclideanVector.cpp: In member function ‘void evec::EuclideanVector::updateNormal()’:
EuclideanVector.cpp:180:32: error: request for member ‘begin’ in ‘*((evec::EuclideanVector*)this)->evec::EuclideanVector::magnitude_’, which is of non-class type ‘double’
   for (auto iter = magnitude_->begin(); iter != magnitude_->end(); ++iter)
                                ^~~~~
EuclideanVector.cpp:180:61: error: request for member ‘end’ in ‘*((evec::EuclideanVector*)this)->evec::EuclideanVector::magnitude_’, which is of non-class type ‘double’
   for (auto iter = magnitude_->begin(); iter != magnitude_->end(); ++iter)

.cpp文件中的函数为:

void EuclideanVector::updateNormal()
    {
        double normal_tmp = 0.0;

        for (auto iter = magnitude_->begin(); iter != magnitude_->end(); ++iter)
        {
            normal_tmp += pow(*iter, 2);
        }

        *normal_ =  sqrt(normal_tmp);

    }

你还需要知道数组的大小(例如num_elements),然后你可以使用指针运算

for (double* iter = magnitude_; iter != (magnitude_ + num_elements); ++iter)
{
    double value = *iter;
}

或者简单地使用索引

for (int i = 0; i < num_elements; ++i)
{
    double value = magnitude_[i];
}

然后 std::beginstd::end 唯一可行的方法是数组大小在该范围内已知,例如

double magnitude_[10];
for (auto iter = std::begin(magnitude_); iter != std::end(magnitude_); ++iter)
{
}

我建议根据您的数组分配方式切换到 std::arraystd::vector,这样您就可以更轻松地使用这些方法。

您的数组不是 class 或对象或任何东西,它基本上只是第一个元素的内存地址(因此类型为 double*)。您正在使用 -> 运算符,该运算符将其取消引用到位于该内存地址的 double 中(工作正常),然后尝试对其调用方法 end() 。但是,您的变量不是包含方法 end() 的 class,而是 double。 C++ 中的数组只不过是内存中彼此相邻存储的一堆值。

如果您希望数组具有这些方法,请将其声明为 std::vector<double>。否则,您必须自己跟踪数组的大小,并执行类似

的操作
for (int i = 0; i < size; i++) {
    double val = magnitude_[i];
    // ....
}

正如 C 和 C++ 原始指针 (double*) 不包含大小信息一样,end 无法从原始指针中提取它。根据您的需要,您可能想使用大小的 C 数组 foo[100]std::arraystd::vector

考虑以下因素:

double * ptr = new double[5];
auto iter = std::end(ptr); //uhh.....

在这种情况下,您希望 std::end 做什么?指针不存储有关它们持有多少对象的信息*,那么std::end将如何找到传递给它的任意指针的末尾?

std::beginstd::end 不能用于基于原始指针的数组。简单地迭代指针本身。

for(double * iter = ptr; iter < ptr+5; iter++) {
    double val = *iter;
    /*...*/
}

* - 好的,从技术上讲,编译器确实存储了这些信息,但它不能以 programmer/language-visible 的方式访问。

一个 double* 变量(即指向 C 风格数组的指针)不是 classstruct 并且没有 begin()end() 迭代器访问函数。

您可以使用需要访问数组大小的指针算法 magnitude_,如下所示:

for (double* it = magnitude_; it != (magnitude_ + magnitude_size); ++it)
    normal_tmp += (*iter)*(*iter);

或根据magnitude_大小固定还是需要expanded/contracted,将magnitude_更改为std::array<double, mag_size>std::vector<double>,然后您可以像在问题中所做的那样使用 begin()end()

您访问变量的方式您假设这是类似于 std::vector 的东西,它有一个内置的迭代器。但是使用普通的 double 数组这显然是行不通的。这就是您收到 is of non-class type 错误的原因。 double 不是 class 而是一种数据类型。 如果您想使用迭代器,请使用 std::vector<double> 或类似的东西。否则使用传统的 for 循环

for(int ii = 0; ii < numel; ii++)
{
    normal_tmp += pow(magnitude_[ii], 2);
}