C++ C++;:使用函数指针作为模板参数

C++ C++;:使用函数指针作为模板参数,c++,templates,C++,Templates,我有以下代码: template<typename Parent, typename T, void (Parent::*Setter)(T), T (Parent::*Getter)()> struct Property { Parent& obj; Property(Parent& _obj) : obj(_obj) {} Property& operator=(T v) { (obj.*Setter)(v); return *this; } op

我有以下代码:

template<typename Parent, typename T, void (Parent::*Setter)(T), T (Parent::*Getter)()>
struct Property {
 Parent& obj;
 Property(Parent& _obj) : obj(_obj) {}
 Property& operator=(T v) { (obj.*Setter)(v); return *this; }
 operator T() { return (obj.*Getter)(); }
};

template<typename T1, typename T2>
class Bimap {
public:
 class Entry;
 typedef std::tr1::shared_ptr<Entry> EntryP; 
 typedef std::multimap<T1, EntryP> T1Map;

 class Entry {
 private:
  Bimap& bimap;
  typename T1Map::iterator it1;

  void set1(T1 v) { bimap.map1.erase(it1); it1 = bimap.map1.insert(typename T1Map::value_type(v, it2->second)).first; }
  T1 get1() { return it1->first; }
 public:
  Property<Entry,T1,set1,get1> first() { return Property<Entry,T1,set1,get1>(*this); }
 };
};
模板
结构属性{
母公司&obj;
属性(父对象):obj(_obj){}
属性和运算符=(tv){(obj.*Setter)(v);返回*this;}
运算符T(){return(obj.*Getter)(;}
};
模板
类Bimap{
公众:
班级报名;
typedef std::tr1::shared_ptr EntryP;
typedef std::multimap T1Map;
班级报名{
私人:
Bimap&Bimap;
typename T1Map::迭代器it1;
void set1(T1 v){bimap.map1.erase(it1);it1=bimap.map1.insert(typename T1Map::value_type(v,it2->second)).first;}
T1 get1(){return it1->first;}
公众:
Property first(){return Property(*this);}
};
};
这段代码给了我(在
属性优先()

“void Bimap::Entry::set1(T1)[with T1=double,T2=std::tr1::shared_ptr]”不能出现在常量表达式中

我也试过了

Property<Entry,T1,&set1,&get1> first() { return Property<Entry,T1,&set1,&get1>(*this); }
Property first(){return Property(*this);}
但这给了我:

错误:模板参数的数量错误(3,应该是4)

错误:为“模板结构属性”提供了

有没有可能以某种方式解决这个问题?或者为什么不可能呢?

你想要的

Property<Entry, T1, &Entry::set1, &Entry::get1>
属性

这些不是普通的函数指针,它们是指向成员函数的指针,因此您必须使用指向成员的指针语法。您认为编译器发出的错误消息可以改进吗?只是curious@Chubsdad我很肯定它能。一个实现知道
set1
引用了一个非静态成员函数,并且知道它试图初始化一个指向成员的指针。我怀疑GCC根本不在乎。