Как специализировать только некоторые члены шаблонного класса? - PullRequest
10 голосов
/ 10 февраля 2011

Код:

template<class T>
struct A {
  void f1() {};
  void f2() {};

};

template<>
struct A<int> {
  void f2() {};
};


int main() {
  A<int> data;
  data.f1();
  data.f2();
};

ОШИБКА:

test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'

По сути, я хочу специализировать только одну функцию и использовать общее определение для других функций.(В реальном коде у меня много функций, которые я не хочу специализировать).

Как это сделать?Спасибо!

Ответы [ 3 ]

10 голосов
/ 10 февраля 2011

Рассмотрим перенос общих частей в базовый класс:

template <typename T>
struct ABase
{
    void f1();
};


template <typename T>
struct A : ABase<T>
{
    void f2();
}  


template <>
struct A<int> : ABase<int>
{
    void f2();
};

Вы даже можете переопределить f1 в производном классе. Если вы хотите сделать что-то более необычное (включая возможность вызова f2 из f1 кода в базовом классе), посмотрите на CRTP .

8 голосов
/ 10 февраля 2011

Поможет ли это:

template<typename T>
struct A
{
  void f1()
  {
    // generic implementation of f1
  }
  void f2()
  {
    // generic implementation of f2
  }
};

template<>
void A<int>::f2()                                                               
{
  // specific  implementation of f2
}
2 голосов
/ 10 февраля 2011

Когда мы объявляем специализации для шаблонного класса, мы также должны определить все его члены, даже те, которые в точности равны универсальному шаблонному классу, потому что нет наследования членов от универсального шаблона до специализации , Таким образом, в вашей специализации вы должны также реализовать void f1();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...