1

次のテンプレートクラスを想像してみてください(メンバーのセッターとゲッターは_t省略されています)。

template<class T>
class chain
{
public:
  static chain<T> NONE;

  chain()
   : _next(&NONE)
  {}

  ~chain() {}

  chain<T>& getNext() const
  {
    return *_next;
  }

  void setNext(chain<T>* next)
  {
    if(next && next != this)
      _next = next;
  }

  chain<T>& getLast() const
  {
    if (_next == &NONE)
      return *this;
    else
      return _next->getLast();
  }

private:
  T _t;
  chain<T>* _next;
};

この概念の基本的な考え方は、nullポインターを使用する代わりに、技術的に有効なオブジェクトでありながらこの役割を担う静的なデフォルト要素を使用することです。これにより、コードをより冗長にすると同時に、nullポインタに関する問題の一部を防ぐことができます...

このテンプレートは問題なくインスタンス化できますが、リンカーは静的メンバーオブジェクトで未解決の外部NONEエラーを出します。

テンプレートをインスタンス化するときに、行static chain<T> NONE; テンプレートをインスタンス化する実装内で実際に発生するため、事実上定義にもなります。しかし、そうではないことが判明しました...

NONE私の質問は次のとおりです。すべてのテンプレートのインスタンス化の前に要素を明示的に定義せずに、可能なことはすべて可能ですか。

4

2 に答える 2

3

非テンプレートクラスと同じように、クラスの外部でそれを定義する必要があります。非テンプレートクラスの場合と同様にNONE、クラス定義内で宣言しただけで、それを定義する必要があります。

template<class T>
class chain
{
    // the same as your example
};

// Just add this
template <class T>
chain<T> chain<T>::NONE;
于 2010-06-23T23:12:48.773 に答える
2
template < typename T >
chain<T> chain<T>::NONE;

動作するはずです

于 2010-06-23T23:14:19.207 に答える