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::begin
和 std::end
唯一可行的方法是数组大小在该范围内已知,例如
double magnitude_[10];
for (auto iter = std::begin(magnitude_); iter != std::end(magnitude_); ++iter)
{
}
我建议根据您的数组分配方式切换到 std::array
或 std::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::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;
/*...*/
}
* - 好的,从技术上讲,编译器确实存储了这些信息,但它不能以 programmer/language-visible 的方式访问。
一个 double*
变量(即指向 C 风格数组的指针)不是 class
或 struct
并且没有 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);
}
我收到以下错误,我怀疑它与类型不匹配或其他原因有关....函数中使用的 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::begin
和 std::end
唯一可行的方法是数组大小在该范围内已知,例如
double magnitude_[10];
for (auto iter = std::begin(magnitude_); iter != std::end(magnitude_); ++iter)
{
}
我建议根据您的数组分配方式切换到 std::array
或 std::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::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;
/*...*/
}
* - 好的,从技术上讲,编译器确实存储了这些信息,但它不能以 programmer/language-visible 的方式访问。
一个 double*
变量(即指向 C 风格数组的指针)不是 class
或 struct
并且没有 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);
}