1

想象一下下面的模板类(_t省略了成员的 setter 和 getter):

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;
};

这个概念的基本思想是,我有一个静态默认元素,而不是使用空指针,它承担这个角色,同时仍然是一个技术上有效的对象;这可以防止空指针的一些问题,同时使代码更加冗长......

我可以很好地实例化这个模板,但是链接器在静态成员对象上给出了一个未解决的外部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 回答