Хорошо, сначала пример кода; это моя попытка общения, что это то, что я пытаюсь сделать, хотя он не компилируется:Переопределение нескольких унаследованных шаблонных функций со специальными версиями
#include <iostream>
template <class T>
class Base
{
public:
virtual void my_callback() = 0;
};
class Derived1
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived1.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived\n";
}
};
class Derived2
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived2.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived2\n";
}
};
int main()
{
{
Derived1 d;
Base<int> * i_p = d;
Base<float> * i_f = d;
i_p->my_callback();
i_f->my_callback();
}
{
Derived2 d;
Base<int> * i_p = d;
Base<float> * i_f = d;
i_p->my_callback();
i_f->my_callback();
}
//Desired output:
// Int callback for Derived1.
// Float callback for Derived1
// Int callback for Derived2.
// Float callback for Derived2
system("Pause");
}
Итак, что я пытаюсь сделать, это своего рода класс-оболочку, чтобы наследовать из которого автоматически подключается производный класс к различным спискам обратных вызовов; он должен подключить конкретный экземпляр производного класса к списку, и я хочу, чтобы «пользователь» имел/получал возможность выполнять функции обратного вызова как часть создания производного класса, как вы можете видеть.
Кажется, что это должно работать, хотя мне может понадобиться использовать другой синтаксис. Если это не сработает, есть ли у вас какие-либо предложения?
Это не компилируется (ССАГПЗ). Ваши объявления Derived :: my_callback не могут работать так. – Frunsi
Это работает для меня; Обратите внимание: я использую Visual Studio 2008, который, как я знаю, имеет некоторые функции, которые не являются стандартными. Благодаря! – Narfanator
Да, это побочный эффект поддержки явной реализации интерфейса. Вы будете в порядке, пока вы можете придерживаться MSVC. –