我正在使用ChaiScript 5.3.1,我正在尝试将函数绑定到我自己的类,特别是一个可以采用Vector3或3浮点数的setPosition函数。
类和它的相关方法声明如下:
class DLLExport Actor
{
public:
Actor(Level* level, const String& name, Actor* parent);
virtual ~Actor();
void setPosition(const Real& x, const Real& y, const Real& z);
void setPosition(const Vector3& position);
};
我试图像这样绑定它们:
m->add(user_type<Actor>(), "Actor");
m->add(fun<void (Actor::*)(const Vector3&)>(&Actor::setPosition), "setPosition");
这会产生以下编译器输出(Windows,MSVC 2013):
2functional(550): error C2027: use of undefined type 'std::_Get_function_impl<_Fty>'
2> with
2> [
2> _Fty=void (__thiscall Actor::* )(const Vector3 &)
2> ]
2> ..\..\ScriptingDemo\Binder.cpp(60) : see reference to class template instantiation 'std::function<void (__thiscall Actor::* )(const Vector3 &)>' being compiled
2functional(551): error C2504: 'type' : base class undefined
2functional(554): error C2027: use of undefined type 'std::_Get_function_impl<_Fty>'
2> with
2> [
2> _Fty=void (__thiscall Actor::* )(const Vector3 &)
2> ]
2functional(554): error C2146: syntax error : missing ';' before identifier '_Mybase'
2functional(554): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
答案 0 :(得分:2)
这是编译器错误。 Clang和GCC都接受this SSCCE,而Visual C ++则不接受。{/ p>
四个重载函数chaiscript::fun
被声明为:
/*1*/ template <typename T>
Proxy_Function fun (T t);
/*2*/ template <typename T>
Proxy_Function fun (const std::function< T > &f);
/*3*/ template <typename T, typename Q>
Proxy_Function fun (T t, const Q &q);
/*4*/ template <typename T, typename Q, typename R>
Proxy_Function fun (T t, const Q &q, const R &r);
根据语言规则,这个表达式:
fun<void (Actor::*)(const Vector3&)>(&Actor::setPosition)
调用重载1或重载2时,重载决策将决定哪个。
在替换显式模板参数之后,这就是重载解析必须使用的内容:
/*1*/ Proxy_Function fun (void (Actor::*)(const Vector3&) t);
/*2*/ Proxy_Function fun (const std::function< void (Actor::*)(const Vector3&) > &f);
std::function< void (Actor::*)(const Vector3&) >
是未定义的类型,因此重载2不可行。 Visual C ++似乎认为这构成了一个错误,但它不应该。
使用您的解决方法:
fun((void(Actor::*)(const Vector3&))&Actor::setPosition)
您正在将指向重载成员函数&Actor::setPosition
的指针转换为类型void(Actor::*)(const Vector3&)
并允许模板参数推导进入,并且Visual C ++对此感兴趣。
你最好避免使用C风格的演员阵容:
fun(static_cast<void(Actor::*)(const Vector3&)>( &Actor::setPosition ))
答案 1 :(得分:0)
不确定怎么样,但是我修好了这个:
m->add(fun((void(Actor::*)(const Vector3&))&Actor::setPosition), "setPosition");
我很高兴我找到了答案,如果有人能解释为什么这样做会很棒。