Специализация шаблона функции в производном классе

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

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

Я сделал что-то вроде этого.

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

11
задан Andreas Brinck 18 December 2009 в 13:23
поделиться

4 ответа

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

6
ответ дан 3 December 2019 в 11:20
поделиться

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

0
ответ дан 3 December 2019 в 11:20
поделиться

Почему вы не можете сделать сообщение об ошибке

template <>
Base::fun(int arg);

g ++ . Мне кажется, что это сообщение об ошибке. fun объявлен в Base , а не в Derived .

1
ответ дан 3 December 2019 в 11:20
поделиться

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


class Derived : public Base
{
public:
  void fun(int) { /* ... */ }
};
-1
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: