变异模板和覆盖

时间:2015-01-20 05:43:23

标签: c++ variadic-templates overwrite

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

#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:注意:因为以下虚函数在'MyObject'中是纯粹的:

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

最佳, Moritz的

1 个答案:

答案 0 :(得分:1)

问题在于MyObject来自Object<int, char, char>,这意味着P=charKeys=<char, char>,但您使用method2覆盖Keys=<int, char>。要么从Object<int, int, char>派生,要么更改MyObject::method2以取tuple<char, char>

需要method2是虚拟的,正如你已经尝试过的那样。通过上述修复,它不会再导致“无法声明”错误。