带有指向成员函数的指针的模板 =VC++ 2017 和 gcc 5.1 的>不同的错误消息



>我被以下代码困住了,希望得到任何建议

template <typename T, class U>
class A {
public:
// Pointer to member function of U
typedef void (U::*MemberPtr)(T);
// Constructor
Action(std::string action_name, MemberPtr func) {
this->fPtr = func;
} 
// Invoke member function of U passed in constructor
void invoke(T argument) {
fPtr(argument); // <-- VC++ error C2064: Expression does not evaluate to a function call, ok for gcc  (Q1)
}
private:
MemberPtr fPtr;

上面的模板用于类"C">

class C; // forward decl
class C {
void dummyDbl(double arg);
Action<double, C> dblAction = Action<double, C>("x", &C::dummyDbl);
// gcc (5.1.0 )complains: (VS 2017 is fine with that) (Q2)
// Action<double, C>("x", &C::dummyDbl);
//                ^
// error: expected unqualified-id before '>' token

我向观众提出的问题是

  1. 为什么编译器(VC++ 2017(抱怨函数调用,而gcc对此很好(见Q1(?我错过了什么?
  2. 知道为什么 gcc 会引发错误而 VC++ 对 decl (Q2( 很好吗?
  3. 是否有机会省略第二个模板参数,但将范围限制为给定类的成员函数(例如,类 X中的 Action 不得调用类Y的成员函数(?

提前感谢, 奥利弗

代码

void invoke(T argument) {
fPtr(argument); // <-- VC++ error C2064: Expression does not evaluate to a function call, ok for gcc  (Q1)
}

格式不正确。您需要一个对象来调用成员函数,而这里没有对象。之所以在 MSVC 中看到错误,但在 GCC 中看到错误,可能是由于处理模板实例化的差异。需要完整的代码来给出确切的原因,但这可能是一个没有实际意义的练习 - 无论外观如何,代码在任何编译器上都是错误的,应该修复。

第二个代码

Action<double, C> dblAction = Action<double, C>("x", &C::dummyDbl);

看起来像 GCC5 中的一个错误,它在 GCC6 中编译正确。从 3.4.1 开始,它在 CLang 中正确编译

此代码可在任何地方编译:

A<double, C> dblAction{"x", &C::dummyDbl};

抱歉,问题3 不清楚,SO 的最佳格式是每个帖子一个问题。所以我建议将问题 3 拆分为单独的帖子。

最新更新