首页 文章

模板化类中的静态const成员初始化

提问于
浏览
7

我有一个关于'static const'成员初始化的问题 . 在模板化类中,我定义了一个const成员并在类外部初始化它 .
当我包含.h文件,其中该类在多个.cpp文件中实现时,我得到一个 LNK2005 error (I'm using VS2010) that says the constant is already defined .

// 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子句,这绝对不是解决方案 .

1 回答

  • 7

    您应该在源文件中定义常量而不是 Headers (因此它只定义一次),因为这是您需要保留在 Headers 中的模板(并且所有实例具有相同的值),您可以使用公共基类 .

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

    Edit: 如果您的编译器支持C 11,则将 static 方法设为constexpr function,以便它具有直接使用该值的所有优化机会 .

相关问题