如何声明模板中使用的常量?

时间:2012-02-22 10:27:09

标签: c++ templates c++11

我有一个模板,它依赖于标题中的常量。像这样:

  1. 定义常量的标题:

    // header1.hpp
    const int CONST_VALUE1 = 10;
    
  2. 我有模板的标题:

    // header2.hpp
    extern const int CONST_VALUE2;
    
    template< int N >
    struct A
    {
    };
    struct B
    {
      // some member functions
      A< CONST_VALUE2 > a;
    };
    
  3. 具有B和常量

    定义的源
    // source2.hpp
    #include "header2.hpp"
    // implementation of B
    const int CONST_VALUE2 = CONST_VALUE1;
    
  4. 这当然不起作用。错误是这样的:

    error: the value of 'CONST_VALUE2' is not usable in a constant expression
    note: 'CONST_VALUE2' was not initialized with a constant expression
    note: in template argument for type 'int'
    

    有解决方法吗?或者我是否必须将header1.hpp包含在header2.hpp中?

4 个答案:

答案 0 :(得分:1)

模板需要非类型参数的常量表达式。对于 一个const变量用于常量表达式,它的变量 初始化必须对编译器可见。所以你可能会有 在header2.hpp中包含header1.hpp。

答案 1 :(得分:0)

header2必须对header2可见。模板化的类不知道如何实例化自己,除非它具有所有的定义。

答案 2 :(得分:0)

This answer告诉extern const不起作用。

然而,我想到了一个解决方法:

  1. 更改header2.hpp以定义常量:

    const int CONST_VALUE2 = 10;
    
  2. 更改源文件以检查常量:

    #include "header2.hpp"
    // implementation of B
    static_assert( CONST_VALUE2 == CONST_VALUE1, "check the constant!" );
    
  3. 这样header2.hpp不必包含header1.hpp(仅在源文件中需要)。

答案 3 :(得分:0)

模板在编译时进行评估,因此必须知道所有模板参数并在此时保持不变。通过将变量声明为extern,编译器在评估模板时不会知道该值,从而给出您看到的错误。

编译模板时,您需要确保模板参数是已知值。