12

コード:

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'

基本的には、1つの関数だけを特殊化し、他の関数には共通の定義を使用したいと思います。(実際のコードでは、専門にしたくない関数がたくさんあります)。

これを行う方法?ありがとう!

4

3 に答える 3

10

共通部分を基本クラスに移動することを検討してください。

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派生クラスでオーバーライドすることもできます。もっと手の込んだことをしたい場合 (基底クラスのコードから呼び出すことができることを含む) は、 CRTP を見f2くださいf1

于 2011-02-10T10:06:09.270 に答える
9

これは役に立ちますか:

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
}
于 2011-02-10T20:07:36.577 に答える
2

テンプレート クラスの特殊化を宣言するときは、ジェネリック テンプレート クラスから特殊化へのメンバーの継承がないため、ジェネリック テンプレート クラスとまったく同じメンバーであっても、すべてのメンバーを定義する必要があります。したがって、専門分野でも実装する必要がありますvoid f1();

于 2011-02-10T10:04:10.770 に答える