0

SubClass が SuperClass から継承しているクラス SuperClass と Subclass があります。

SuperClass には、値がそれを使用する SubClass に依存する定数プロパティがあります。ただし、スーパークラスには他のメソッドも使用しているため、スーパークラスで宣言する必要がありますが、インスタンス化されたサブクラスの型に応じて定数の値が変化するため、サブクラスで初期化する必要があります。

SO に関する以前の質問から、これに対する最善の解決策は特性クラスを使用することだとわかっています。ただし、そのようなソリューションを使用すると、コードに大幅な変更が必要になります。したがって、ここに示すアプローチを選択しました。

SuperClass.h

#ifndef SUPERCLASS_H
#define SUPERCLASS_H


#include <string>

template <class T, class P>
class SuperClass
{
      public:

       typedef T type;
       typedef P position;

       static const position NULLPOSITION;

};

#endif

SubClass.h

#ifndef SUBCLASS_H
#define SUBCLASS_H

#include <string>
#include "SuperClass.h"


template <class T>
class SubClass:public SuperClass<T,int>
{

};

template<class T>
const typename SuperClass<T,int>::position SuperClass<T,int>::NULLPOSITION=0;

#endif

main.cpp

#include <cstdlib>
#include <iostream>
#include "SubClass.h"

using namespace std;

int main(int argc, char *argv[])
{
    SubClass<int> subClass;

    system("PAUSE");
    return EXIT_SUCCESS;
}

コンパイルすると、

invalid use of undefined type `class SuperClass<T, int>

declaration of `class SuperClass<T, int>

エラー。問題は何ですか?

4

2 に答える 2

2

問題は の定義ですNULLPOSITIONNULLPOSITIONtemplateの静的メンバーを宣言しましたSuperClassが、定義していません。代わりに、メンバーの部分的な明示的なインスタンス化のためにメンバーを定義しようとします。部分的な明示的なインスタンス化定義を削除し、NULLPOSITION代わりに通常のテンプレート クラスの静的メンバー定義を定義する必要があります。

サブクラスが に異なる初期化値を提供できるようにするにはNULLPOSITION、(おそらくオプションの) テンプレート パラメータを介してこれを実現できます。

template <class T, class P, P INIT>
class SuperClass
{
public:
    typedef T type;
    typedef P position;
    static const position NULLPOSITION;
};

template<class T, class P, P INIT>
const typename SuperClass<T,P,INIT>::position
    SuperClass<T,P,INIT>::NULLPOSITION = INIT;

template <class T>
class SubClass:public SuperClass<T,int, 0>
{
};
于 2013-08-29T18:27:10.293 に答える
0

自分のやり方を専門化することで、実際には NULLPOSITION をインスタンス化していません (または POSIZIONENULLA、コードを確認してください)

14.7.1.2

特に、静的データ メンバーの定義が存在することを必要とする方法で静的データ メンバー自体が使用されない限り、静的データ メンバーの初期化 (および関連する副作用) は発生しません。

次のように、データ メンバーを別のクラスで明示的に定義したい場合があります。

template<typename P>
class PositionClass
{
    public:
        typedef P position;
        static const position NULLPOSITION;
};
template <typename T, class P>
class SuperClass : public PositionClass<P>
{
    public:
        typedef T type;
};

const PositionClass<int>::position  PositionClass<int>::NULLPOSITION = 0;
于 2013-08-29T18:26:24.417 に答える