7

「static const」メンバーの初期化に関して問題があります。テンプレート化されたクラスでは、const メンバーを定義し、クラス外で初期化します。
このクラスが複数の .cpp ファイルに実装されている .h ファイルを含めると、LNK2005 エラー (私は VS2010 を使用しています) が表示され、定数が既に定義されているというメッセージが表示されます。

// List.hpp
template <class T>
class List {
    static const double TRIM_THRESHOLD;
};

template <class T>
const double List<T>::TRIM_THRESHOLD = 0.8;

メンバーの初期化を .cpp ファイルに入れてみましたが、定数がまったく定義されていないというリンカー エラーが発生します。リストがテンプレート化されておらず、初期化を .cpp ファイルに入れた場合、すべて問題ありません。
この状況の解決策はありますか? 私はすでにファイルの周りに #ifdef/define 節を持っていますが、それは間違いなく解決策ではありません。

4

1 に答える 1

8

ヘッダーではなくソースファイルで定数を定義する必要があります(したがって、一度だけ定義されます)。これはヘッダーに保持する必要があるテンプレートであるため(そしてすべてのインスタンスが同じ値を持つため)、共通の基本クラスを使用できます。

class ListBase {
protected:
    ListBase() {} // use only as base 
    ~ListBase() { } // prevent deletion from outside
    static const double TRIM_THRESHOLD;    
};

template <class T>
class List : ListBase {  
};

// in source file
double ListBase::TRIM_THRESHOLD = 0.8;

別のオプションは、静的関数として使用することです。

    static double trim_threashold() { return 0.8; }

編集:コンパイラが C++11 をサポートしている場合は、staticメソッドをconstexpr関数にして、値を直接使用することで得られるすべての最適化の機会が得られるようにします。

于 2010-07-22T08:33:00.023 に答える