1

クラスの階層の下に定義しました。私の意図は、enum オブジェクトを反復処理できるジェネリック クラスを設計することです (残念ながら C++11 は使用できません)。クラス定義とテスト プログラムは次のとおりです。

// base.h

#include <set>

template <typename T>
class Base
{
protected:
   explicit Base(int value);
   typedef typename std::set< Base<T>* > instances;
   static instances s_instances;
   int value_;


public:
   int get_value() const { return value_ ; }
};

template <typename T>
Base<T>::Base(int value): value_(value)
{
   s_instances.insert(this);
}

// 派生.h

#include "base.h"

class Derived : public Base<Derived>
{
protected:
    explicit Derived(int value): Base<Derived>(value) { }

public:
    static const Derived value1;
};

// test.cc

#include "derived.h"


template<>
Base<Derived>::instances Base<Derived>::s_instances;

const Derived Derived::value1(1);

int main(int argc, char *argv[])
{

   using std::cout;
   using std::endl;

   cout << Derived::value1.get_value() << endl;

}

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 を使用してコンパイルすると、以下のリンク エラーが表示されます。

g++ test.cc -o test
/tmp/ccOdkcya.o: In function `Base<Derived>::Base(int)':
test.cc:(.text._ZN4BaseI7DerivedEC2Ei[_ZN4BaseI7DerivedEC5Ei]+0x28): undefined reference to `Base<Derived>::s_instances'
collect2: ld returned 1 exit status

"

上記のコードで何が欠けているのか、誰でも提案できますか?

ありがとう!

4

3 に答える 3

0

あなただけが書くことができます

// template<> -> you should not write this in this case.
Base<Derived>::instances Base<Derived>::s_instances;

次のような の明示的な特殊化を提供した場合Base<Derived>:

class Derived;
template <>
class Base<Derived>
{
protected:
  explicit Base(int value);
  typedef typename std::set< Base<Derived>* > instances;
  static instances s_instances;
  int value_;


public:
  int get_value() const { return value_ ; }
};

それ以外の場合は、次のように書く必要があります。

template<typename T>
typename Base<T>::instances Base<T>::s_instances;
于 2013-04-04T05:05:54.620 に答える