这是我的用例:
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/