错误:请求成员' end ' ..它是非类类型' double '

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

本文关键字:是非 类型 double end 请求 错误 成员      更新时间:2023-10-16

我得到了以下错误,我怀疑这与类型不匹配或其他东西....有关在函数中使用的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,然后您可以更轻松地使用这些方法。

您的数组不是类或对象或任何东西,它基本上只是第一个元素的内存地址(并且类型为double*)。您正在使用->操作符,它将其解引用到位于该内存地址的double中(它工作得很好),然后尝试在其上调用end()方法。但是,变量不是包含方法end()的类,而是包含方法double的类。c++中的数组只不过是内存中一堆紧挨着的值。

如果你想让你的数组有这些方法,声明它为std::vector<double>。否则,您将不得不自己跟踪数组的大小,并执行

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

double*变量(即指向c风格数组的指针)不是classstruct,也没有begin()end()迭代器访问函数。

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

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

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

就像C和c++中的原始指针(double*)不包含大小信息一样,end也不能从原始指针中提取大小信息。您可能希望使用大小的c数组foo[100]std::arraystd::vector,这取决于您的需要。

访问变量的方式假设它类似于内置迭代器的std::vector。但是使用普通的double数组,这显然不起作用。这就是为什么你得到is of non-class type错误。double不是类,而是数据类型。如果想使用迭代器,请使用std::vector<double>或类似的代码。否则使用传统的for循环

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

考虑以下内容:

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;
    /*...*/
}

* -好的,从技术上讲,编译器确实存储了这些信息,但它不能以程序员/语言可见的方式访问