2015-01-20 3 views
0

을 덮어 쓰기 :가변 인자 템플릿과 나는 다음과 같은 방법으로 방법을 덮어 쓸 어떻게 든 수 있는지 궁금

#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'를 출력하고 싶습니다.

나는 다음과 같은 오류가

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

에 방법 2를 변경하는 경우 :

오류 : 변수가 추상 형식 '을 MyObject'OBJ의 수 'obj와'선언 할 수 없습니다;
main.cpp : 16 : 7 : 참고 : 다음 가상 함수가 'MyObject'내에서 순수하기 때문에 :

MyObject에서 method2를 덮어 쓰는 올바른 방법은 무엇입니까?

최저

, 모리츠

+0

게시 한 오류는 '가상'기능에 관한 것이지만 코드에는 아무것도 없습니다. –

+0

마찬가지로 "method2를 가상 함수로 변경하면 ..."라고 언급했습니다. 가상 기능이 없으면 그냥 "Hello1"을 인쇄합니다. – moo

답변

1

문제는 MyObjectP=charKeys=<char, char> 의미 Object<int, char, char>에서 유래하지만 Keys=<int, char>method2을 무시한다는 것입니다. Object<int, int, char>에서 파생되거나 MyObject::method2tuple<char, char>으로 변경하십시오.

method2은 이미 시도한 것처럼 가상이되어야합니다. 위의 수정을 통해 "can not declare"오류가 더 이상 발생하지 않습니다.

+0

감사합니다. 작은 예제에서 작동합니다. 그러나 실제 프로그램에서는 모든 것이 작동하지 않습니다. 동일한 오류를 생성하는 최소 예를 제공하려고합니다 : "확장 패턴 '...'에는 인수 팩이 없습니다". – moo

+0

좋아, 고쳐 줘. 또 다른 문제가있었습니다! 감사. – moo