这是我的用例:

class A:
protected:
   virtual void methodA1(const void* const s, const std::streamsize n) const;
   inline void methodA2(const void* const s, const std::streamsize n) const;

class B : public A
private:
    const  char *a;
    template <void (*T)(const void* const, const std::streamsize)>
    void doOperation(const char* b) {
        T(a, b - a);
    }

    //here comes the template usage
    void methodB1(const char *x) {
         doOperation<methodA1>(x);
    }

    void methodB2(const char *x) {
         doOperation<methodA2>(x);
    }


问题是无法编译。我收到类似template argument deduction/substitution failed:invalid use of non-static member function的错误。

我怎样才能达到预期的行为?

最佳答案

methodA1的类型为void (A::*)(const void* s, std::streamsize) const

因此,您必须将代码调整为:

class A
{
public:
   virtual void methodA1(const void* const s, const std::streamsize n) const = 0;
   void methodA2(const void* const s, const std::streamsize n) const {}
};

class B : public A
{
private:
    const  char *a;
    void methodA1(const void* s, std::streamsize n) const override {}

    template <void (A::*M)(const void*, std::streamsize) const>
    void doOperation(const char* b) {
        (this->*M)(a, b - a); // method pointer usage
    }

    //here comes the template usage
    void methodB1(const char *x) {
         doOperation<&A::methodA1>(x);
    }

    void methodB2(const char *x) {
         doOperation<&A::methodA2>(x);
    }
};

关于c++ - 将基类中的函数用作派生类中的模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46362280/

10-10 23:19