Специализация шаблона функции в производном классе - PullRequest
10 голосов
/ 18 декабря 2009

У меня есть базовый класс с шаблоном функции.

Я наследую базовый класс и пытаюсь получить специализацию для шаблона функции в производном классе

Я сделал что-то подобное.

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 жалуется на отсутствие забавного объявления функций в классе Derived.

Я не знаю, какой компилятор ведет себя правильно. Любая помощь в этом с благодарностью.

Спасибо заранее, Surya

Ответы [ 4 ]

6 голосов
/ 18 декабря 2009

Вам необходимо объявить функцию в 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' для генерации кода при его вызове вместо ссылки на специализацию.

1 голос
/ 18 декабря 2009

Почему ты не можешь сделать

template <>
Base::fun(int arg);
Сообщение об ошибке

g++ выглядит как раз для меня. fun объявлено в Base, а не в Derived.

0 голосов
/ 18 декабря 2009

g ++ ведет себя правильно, потому что в Base определено веселье.

0 голосов
/ 18 декабря 2009

Кроме того, альтернативным вариантом будет простая не шаблонная функция в Derived ...

<code>
class Derived : public Base
{
public:
  void fun(int) { /* ... */ }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...