![](/img/trans.png)
[英]Error: request for member 'display' in 'square', which is of non-class type 'GameBoxes::Box<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::begin
和std::end
可以起作用的唯一方法是,在该范围内是否知道数组大小,例如
double magnitude_[10];
for (auto iter = std::begin(magnitude_); iter != std::end(magnitude_); ++iter)
{
}
我建议根据数组的分配方式切换到std::array
或std::vector
,然后可以更轻松地使用这些方法。
您的数组不是类,对象或其他任何东西,它基本上只是第一个元素的内存地址(也就是double*
类型)。 您正在使用->
运算符,该运算符将其取消引用到位于该内存地址的double
(这很好用),然后尝试在其上调用end()
方法。 但是,您的变量不是包含方法end()
,而是一个double
。 C ++中的数组不过是一堆彼此相邻存储的值。
如果希望数组具有这些方法,则将其声明为std::vector<double>
。 否则,您必须自己跟踪数组的大小,并执行类似的操作
for (int i = 0; i < size; i++) {
double val = magnitude_[i];
// ....
}
double*
变量(即指向C样式数组的指针)不是class
或struct
,并且不具有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::array
或std::vector
。
考虑以下:
double * ptr = new double[5];
auto iter = std::end(ptr); //uhh.....
在这种情况下,您究竟期望std::end
做些什么? 指针不存储有关它们持有*的对象的信息,那么std::end
将如何查找已传递给它的任意指针的结尾?
std::begin
和std::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.