【发布时间】:2020-04-22 15:42:47
【问题描述】:
我想创建一个模板类,它的构造函数接受一个对象指针和一个指向对象方法之一的指针。模板类必须接受带有任何参数的方法,所以我认为方法的类型应该是模板参数。我也更愿意接受具有任何返回类型的方法,但可以将其限制为返回 void。下面的代码无法编译。什么是正确的语法?
template <typename Obj, typename Method>
class Foo
{
public:
Foo(Obj *obj, Obj::*Method method)
:mObj(obj), mMethod(method)
{}
void callMethod()
{
mObj->mMethod();
}
private:
Obj* mObj;
Obj::*Method mMethod;
};
class Bar
{
public:
// I want it to work no matter what arguments this method takes.
void method() {}
};
Bar bar;
Foo <Bar, void(Bar::*)()> foo(&bar, &Bar::method);
我在 Foo 构造函数中收到此错误:
error C2059: syntax error: '<tag>::*'
我在这个主题上的previous question 被标记为重复,但引用的示例指定了可以传递的方法的确切类型,我需要它是通用的。
【问题讨论】:
-
只是有点语法错误:
Method Obj::*method. -
你为什么不直接使用
std::function和/或std::bind? -
<tag>是什么? -
@idclev463035818 MSVC 的解析器感到困惑并吐出一个通用错误字符串。