2015-01-20 2 views
0

Я задаюсь вопросом, является ли это каким-то образом можно переписать метод следующим образом:шаблон VARIADIC и перезапись

#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: поскольку в «MyObject» чистые следующие виртуальные функции:

Каков правильный способ перезаписи метода2 в MyObject?

Бест, Moritz

+0

Ошибка, которую вы опубликовали, это функция 'virtual', но ваш код не имеет. –

+0

Как я уже упоминал: «Даже если я изменю метод2 на виртуальную функцию ...». Без виртуальной функции он просто печатает «Hello1». – moo

ответ

1

Проблема заключается в том, что MyObject происходит от Object<int, char, char>, что означает P=char и Keys=<char, char>, но переопределить method2 с Keys=<int, char>. Либо выведите Object<int, int, char>, либо измените MyObject::method2, чтобы принять tuple<char, char>.

Вы также необходимо method2 быть виртуальным, как вы уже пробовали. С приведенным выше исправлением это больше не приведет к ошибке «can not declare».

+0

Спасибо, это работает для небольшого примера. Но в моей реальной программе все не работает. Я попытаюсь предоставить минимальный пример, который создает ту же ошибку: «шаблон расширения« ... »не содержит пакетов аргументов». – moo

+0

Хорошо, исправил. Еще одна проблема! Благодарю. – moo

Смежные вопросы