错误:请求成员' end ' ..它是非类类型' 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
,然后您可以更轻松地使用这些方法。
您的数组不是类或对象或任何东西,它基本上只是第一个元素的内存地址(并且类型为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_
是固定大小还是需要扩展/收缩,将magnitude_
更改为std::array<double, mag_size>
或std::vector<double>
,然后您可以使用begin()
和end()
,就像您在问题中所做的那样。
就像C和c++中的原始指针(double*
)不包含大小信息一样,end
也不能从原始指针中提取大小信息。您可能希望使用大小的c数组foo[100]
或std::array
或std::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::begin
和std::end
不能用于原始的基于指针的数组。只需对指针本身进行迭代。
for(double * iter = ptr; iter < ptr+5; iter++) {
double val = *iter;
/*...*/
}
* -好的,从技术上讲,编译器确实存储了这些信息,但它不能以程序员/语言可见的方式访问
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 错误:请求成员 .. 是非类类型"char"
- 请求成员 'begin' in 'c' 中,它是非类类型 'char [101]' sort(c.begin(), c
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 请求成员“写入”中的“chol_out_data”,这是非类类型
- C 要求成员''in'',该请求是非类型的“”
- 非分解功能类型可以是非类型参数
- C++:成员'的错误请求;Foo'在'f',其是非类类型'Foo*'
- 结构是非文本类型
- 请求以"y"表示的成员'print',这是非类类型
- Haskell相当于C++模板而不是非类型
- char* 具有内部链接,因此它不能不是非类型模板参数
- 请求会员是非类类型
- 错误:请求成员…在. .它是非类类型的
- 在c++中,可迭代类型应该是非多态的
- 错误:请求成员' end ' ..它是非类类型' double '