可变参数模板和覆盖

Variadic template and overwriting

我想知道是否可以通过以下方式覆盖方法:

#include <iostream>
#include <tuple>

template<typename P, typename ...Keys>
class Object {
public:
    void method1(P p, Keys... keys) {
        method2(std::make_tuple(keys...), p);
    }

    void method2(const std::tuple<Keys...> my_tuple, int id) {
        printf("Hello1!");
    }
};

class MyObject : public Object<int, char, char> {
public:
    void method2(const std::tuple<int, char> my_tuple, int id) {
        printf("Hello2!");
    }
};

int main(int argc, char *argv[]) {
    MyObject obj;
    int a = 13;
    obj.method1(a, 'a', 'c'); // prints Hello1! and not Hello2!
}

此代码打印 'Hello1'。我想让它打印 'Hello2'.

如果我把method2改成

abstract void method2(const std::tuple<Keys...> my_tuple, int id) = 0;

我收到以下错误:

错误:无法将变量 'obj' 声明为抽象类型 'MyObject' obj;
main.cpp:16:7: note:because 以下虚函数在 'MyObject':

中是纯虚函数

在 MyObject 中覆盖 method2 的正确方法是什么?

最好的, 莫里茨

问题是 MyObject 派生自 Object<int, char, char>,这意味着 P=charKeys=<char, char>,但是您用 Keys=<int, char> 覆盖了 method2。派生自 Object<int, int, char> 或更改 MyObject::method2 以采用 tuple<char, char>.

需要method2是虚拟的,因为你已经尝试过了。通过上述修复,它不会再导致 "cannot declare" 错误。