2010-09-19 6 views
1

J'ai le code suivant:C++: en utilisant des pointeurs de fonction comme arguments de modèle

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); } 
}; 
}; 

Ce code me donne (sur Property<...> first()):

'void Bimap<T1, T2>::Entry::set1(T1) [with T1 = double, T2 = std::tr1::shared_ptr<Node>]' cannot appear in a constant-expression

J'ai aussi essayé avec

Property<Entry,T1,&set1,&get1> first() { return Property<Entry,T1,&set1,&get1>(*this); } 

mais cela me donne:

error: wrong number of template arguments (3, should be 4)
error: provided for 'template<class Parent, class T, void (Parent::* Setter)(T), T (Parent::* Getter)()> struct Property'

Est-il possible de résoudre ce problème en quelque sorte? Ou pourquoi n'est-ce pas possible?

+0

Ce ne sont pas des pointeurs de fonction ordinaire, ce sont des fonctions pointeur à membre, vous devez utiliser le pointeur à la syntaxe membre. –

Répondre

2

Vous voulez

Property<Entry, T1, &Entry::set1, &Entry::get1> 
+0

Pensez-vous que le message d'erreur du compilateur peut être amélioré? Juste curieux – Chubsdad

+0

@ Chubsdad Je suis tout à fait sûr que cela peut. Une implémentation sait que 'set1' fait référence à une fonction membre non statique et sait qu'elle essaie d'initialiser un pointeur sur member. Je soupçonne que GCC ne s'en soucie pas. –

Questions connexes