STL에서 멤버함수 포인터 어댑터 사용 도움 부탁드립니다.

guru245의 이미지

for_each를 사용하여 deque에 들어있는 포인터 객체들을 해제하기 위해 소멸자에 다음과 같이 넣었습니다.

Menu::~Menu()
{
for_each(children.begin(), children.end(), mem_fun(&Menu::deleteChild));
}

void Menu::deleteChild(Menu* menu) const
{
delete menu;
}

에러메시지는 다음과 같이 뜹니다.
27 menu.cpp:30: instantiated from here
28 /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/include/g++-v3/bits/stl_algo.h:158: error: no match for call to `(std::mem_fun1_t) (Menu*&)'
29 /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/include/g++-v3/bits/stl_function.h:792: note: candidates are: void std::mem_fun1_t::operator()(_Tp*, _Arg) const [with _Tp = Menu, _Arg = Menu*]

이것 저것 다 해봤지만 해결하질 못하겠습니다. 헤더파일 소스는 아래에 올리겠습니다.

class Menu {
public:
Menu(const std::string& title = "", Menu* parent = 0);
Menu(const Menu& other);
const Menu& operator= (const Menu& other);
virtual ~Menu() = 0;

virtual Menu* add(Menu* child);

void setTitle(const std::string& title);
const std::string& getTitle() const;

protected:
void Menu::deleteChild(Menu* menu) const;
std::string title;
Menu* parent;

private:
std::deque<Menu*> children;
};

sandro의 이미지

Menu:: deleteChild는 인수 하나를 받아야 하는데 for_each에는
인수 형태를 void로 넘겼으니 형체크에서 오류가 나는건 당연합니다.

해결법은 std::bind를 사용하시거나 functor로 해결하셔야 합니다.

無心