次のテンプレートクラスを想像してみてください(メンバーのセッターとゲッターは_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
私の質問は次のとおりです。すべてのテンプレートのインスタンス化の前に要素を明示的に定義せずに、可能なことはすべて可能ですか。