7

我有一个关于“静态常量”成员初始化的问题。在模板类中,我定义了一个 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 回答