我试图遍历我的向量并获取存储在向量中的项目的地址。它适用于其他类型的迭代器(见下文),但当我尝试为for(auto it :my_vec)
执行此操作时,它会抛出错误error: no match for 'operator*' (operand type is 'my_class')
#include <iostream>
#include <vector>
class my_class{
int x;
public:
my_class(int x_):x(x_){}
};
std::vector<my_class> my_vec;
void fill_vec(size_t size){
for(int i = 0; i < size; i++){
my_vec.push_back(my_class(i));
}
}
int main(){
size_t size = 10;
fill_vec(size);
for(auto it :my_vec){
std::cout << &it << std::endl;
std::cout << &(*it) << std::endl;
}
std::cout << "-----------" << std::endl;
for(auto it = my_vec.begin(); it != my_vec.end(); it++){
std::cout << &(*it) << std::endl;
}
std::cout << "-----------" << std::endl;
for(size_t i = 0; i < my_vec.size(); i++){
std::cout << &my_vec[i] << std::endl;
}
return 0;
}
答案 0 :(得分:3)
基于范围的for循环获取值,而不是迭代器。使用auto& it : myVec
获取myVec
中对象的引用。
答案 1 :(得分:3)
如何根据循环获取范围内对象的地址?
与获取其他地方的对象地址的方式相同:使用addressof运算符(operator&
)。
它适用于其他类型的迭代器(见下文),但当我尝试为
for(auto it :my_vec)
执行此操作时,它会抛出错误error: no match for 'operator*' (operand type is 'my_class')
基于for循环的范围不会给你一个迭代器。它给你一个对象。在这种情况下,您使用了auto
,因此它为您提供了my_class
实例(因为恰好是容器的value_type
),它是向量中对象的副本。 my_class
(解除引用运算符)没有operator*
重载,因此您尝试的行(包含*it
)不起作用,编译器会为您描述问题。
因此,std::cout << &it << std::endl;
是正确的,但它会为您提供副本的地址,而不是向量中的对象。由于您可能需要向量中对象的地址,因此您应该使用auto&
或my_class&
来获取引用。当您使用引用作为addressof运算符的操作数时,您将获得引用对象的地址。