벡터에 레퍼런스를 저장하려면?
조회수 4876회
std::vector<int &> hello;
같이 int의 레퍼런스를 저장하려고 하면
"error C2528: 'pointer' : pointer to reference is illegal"
에러가 뜹니다.
제가 포인터를 잘 못써서 레퍼런스로 하려는 건데 왜 이런 에러가 뜨는 거죠? 꼭 포인터를 써야 하나요?
1 답변
-
C++11미만의 컴파일러에서
containter 원소의 type은 값을 할당할 수 있어야(assignable) 합니다. 그런데 레퍼런스는 한 번 초기화되면 다른 값을 레퍼런스 할 수 없으므로 assignable하지 않기 때문에 컴파일 에러가 발생하는 것입니다.
C++11부터
C++11부터는
std::reference_wrapper
를 써서 레퍼런스를 저장할 수 있습니다.밑의 예제는 레퍼런스를 vector에 저장해 vector의 원소를 이터레이팅 합니다.
#include <iostream> #include <vector> class MyClass{ public: int x; MyClass(int y): x(y) {} void func(){ std::cout<<"I am func" << std::endl; } }; int main(){ std::vector<std::reference_wrapper<MyClass>> vec; MyClass obj1(2); MyClass &obj_ref1=std::ref(obj1); vec.push_back(obj_ref1); for( auto ob : vec) { std::remove_reference<MyClass&>::type(ob).func(); std::cout<<std::remove_reference<MyClass&>::type(ob).x<< std::endl; } }
댓글 입력