C++ 模板对象作为模板类的静态成员

C++ 模板对象作为模板类的静态成员,c++,templates,static,members,C++,Templates,Static,Members,想象一下,忽略了以下成员的模板类setter和getter: 这个概念的基本思想是,我没有使用空指针,而是有一个静态的默认元素,它承担这个角色,同时仍然是一个技术上有效的对象;这可以防止空指针出现一些问题,同时使代码更加冗长 我可以很好地实例化这个模板,但是链接器在静态成员对象NONE上给出了一个未解决的外部错误 我假设在实例化模板时,行静态链没有;实际上也是一个定义,因为它实际上发生在实例化模板的实现中。然而,事实证明不是 我的问题是:这样的事情是可能的吗?如果可能的话,如何在不在每个模板实例

想象一下,忽略了以下成员的模板类setter和getter:

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

我可以很好地实例化这个模板,但是链接器在静态成员对象NONE上给出了一个未解决的外部错误

我假设在实例化模板时,行静态链没有;实际上也是一个定义,因为它实际上发生在实例化模板的实现中。然而,事实证明不是


我的问题是:这样的事情是可能的吗?如果可能的话,如何在不在每个模板实例化之前显式定义NONE元素的情况下?

您仍然需要像非模板类一样在类之外定义它。就像在非模板类中一样,在类定义中只声明了NONE,并且仍然需要定义它:

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

// Just add this
template <class T>
chain<T> chain<T>::NONE;

您仍然需要像非模板类一样在类之外定义它。就像在非模板类中一样,在类定义中只声明了NONE,并且仍然需要定义它:

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

// Just add this
template <class T>
chain<T> chain<T>::NONE;
应该有用


应该可以工作

老实说,我不认为使用空指针比使用空指针更干净。只需将every&NONE替换为0。老实说,我不认为这比使用空指针更干净。只需将every&NONE替换为0。啊,我看到您实际上可以在仍然被模板化的情况下定义静态成员。每次实例化都要这样做会很麻烦,但是你的解决方案是完美的。啊,我看到你可以在仍然被模板化的情况下定义静态成员。对于每一个实例化都必须这样做会很麻烦,但您的解决方案是完美的。
template < typename T >
chain<T> chain<T>::NONE;