#include <set>

struct Base
{
    virtual int F(int);
};

struct Derived : public Base
{
    int F(int);
};

template<typename Type, typename Return, typename Parameter, Return (Type::*)(Parameter)> struct W
{
};

int main(int argc, char **argv)
{
	typedef std::set<int> setint;

	std::pair<setint::iterator, bool> (setint::*p_1)(const setint::value_type &) = &setint::insert;
	W<setint, std::pair<setint::iterator, bool>, const setint::value_type &, &setint::insert> w_1;

    int (Derived::*p_2)(int) = &Derived::F;
	W<Derived, int, int, &Derived::F> w_2;

	return 0;
}
