У меня есть базовый класс с шаблоном функции.
Я происхожу из базового класса и пытаюсь иметь специализацию для шаблона функции в производном классе
Я сделал что-то вроде этого.
class Base
{
..
template <typename T>
fun (T arg) { ... }
};
class Derived : public Base
{
...
} ;
template <>
Derived::fun(int arg);
и в .cpp файле я обеспечил реализацию для шаблонной специализации.
Это хорошо работает с MSVC 8.0, и g ++-4.4.2 жалуется на отсутствие забавы объявления функции в Производном классе.
Я не знаю, какой компилятор ведет себя правильно. Любая справка в этом значительно ценится.
Заранее спасибо, Surya
Вам необходимо объявить функцию в Derived, чтобы иметь возможность перегрузить ее:
class Derived : public Base
{
template <typename T>
void fun (T arg)
{
Base::fun<T>(arg);
}
} ;
template <>
void Derived::fun<int>(int arg)
{
// ...
}
Обратите внимание, что вам может потребоваться встроить специализацию или переместить ее в файл реализации, и в этом случае вы должны прототипировать специализацию в заголовочном файле как:
template <>
void Derived::fun<int>(int arg);
, иначе компилятор будет использовать обобщенную версию 'fun' для генерации кода при его вызове вместо ссылки на специализацию.
g ++ ведет себя правильно, потому что fun определяется в Base.
Почему вы не можете сделать сообщение об ошибке
template <>
Base::fun(int arg);
g ++
. Мне кажется, что это сообщение об ошибке. fun
объявлен в Base
, а не в Derived
.
Кроме того, альтернативным вариантом может быть простая нешаблонная функция в Derived ...
class Derived : public Base
{
public:
void fun(int) { /* ... */ }
};