繁体   English   中英

错误:在…中的成员'end'请求是非类类型'double'的

[英]error: request for member ‘end’ in … which is of non-class type ‘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_ std::array<double, mag_size>更改为std::array<double, mag_size>std::vector<double>具体取决于magnitude_ std::vector<double>是固定大小还是需要扩展/收缩,然后可以使用begin()end()就像您在问题中所做的一样。

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

*-好的,从技术上讲,编译器确实会存储此信息,但是不能以程序员/语言可见的方式进行访问。

您访问变量的方式假定这类似于内置了迭代器的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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM