Come Adam S notato nei commenti questo errore si verifica quando tenta di compilare this simple code che usa la libreria Selene:
#include <selene.h>
class C {
public:
bool get() const;
};
bool C::get() const {return true;}
int main() {
sel::State state;
state["C"].SetClass<C>("get", &C::get);
}
Il compilatore non riesce a compilare il codice in Class.h
intestazione. Ci sono due overload di membro funzione _register_member
della classe Class
in esso:
template <typename T,
typename A,
typename... Members>
class Class : public BaseClass {
private:
// ...
template <typename M>
void _register_member(lua_State *state,
const char *member_name,
M T::*member) {
// ...
}
template <typename Ret, typename... Args>
void _register_member(lua_State *state,
const char *fun_name,
Ret(T::*fun)(Args...)) {
// ...
}
// ...
};
Il compilatore non può scegliere la seconda di sovraccarico quando un puntatore a un membro const
funzione viene passato come terzo argomento. Ci dovrebbe essere un altro sovraccarico che potrebbe accettare un membro della funzione const
. Dovrebbe essere dichiarata come segue:
template <typename Ret, typename... Args>
void _register_member(lua_State *state,
const char *fun_name,
Ret(T::*fun)(Args...) const)
^^^^^
Senza tale sovraccarico il compilatore sceglie il primo di sovraccarico che è stato creato per lavorare con puntatori a membri dati (non funzionare membri) e non riesce a compilare il codice.
Così non si può trattare con i membri const
funzione quando si utilizza la versione corrente di Selena biblioteca (in modo da farlo almeno).
Ci sono molte domande sul codice. Perché si passa 'M (T *)' come argomento modello a 'std :: function' (dovrebbe essere semplice' M' a causa della logica del programma)? Expression 't -> * member' non può essere usato senza elenco di argomenti come so. Non ha tipo. E così via ... – Constructor
Mi dispiace per 'M (T *)', questa parte è giusta. Ma la costruzione 't -> * member' [senza lista di argomenti come ho detto sopra] può essere usata solo per i membri di dati di classe, non per i membri di funzioni di classe. – Constructor
È strano perché con le funzioni membro non const il codice e la libreria funzionano bene. – Appleshell