可变参数模板和覆盖
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=char
和 Keys=<char, char>
,但是您用 Keys=<int, char>
覆盖了 method2
。派生自 Object<int, int, char>
或更改 MyObject::method2
以采用 tuple<char, char>
.
你也需要method2
是虚拟的,因为你已经尝试过了。通过上述修复,它不会再导致 "cannot declare" 错误。
我想知道是否可以通过以下方式覆盖方法:
#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=char
和 Keys=<char, char>
,但是您用 Keys=<int, char>
覆盖了 method2
。派生自 Object<int, int, char>
或更改 MyObject::method2
以采用 tuple<char, char>
.
你也需要method2
是虚拟的,因为你已经尝试过了。通过上述修复,它不会再导致 "cannot declare" 错误。