我有一个模板,它依赖于标题中的常量。像这样:
定义常量的标题:
// header1.hpp
const int CONST_VALUE1 = 10;
我有模板的标题:
// header2.hpp
extern const int CONST_VALUE2;
template< int N >
struct A
{
};
struct B
{
// some member functions
A< CONST_VALUE2 > a;
};
具有B和常量
定义的源// source2.hpp
#include "header2.hpp"
// implementation of B
const int CONST_VALUE2 = CONST_VALUE1;
这当然不起作用。错误是这样的:
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中?
答案 0 :(得分:1)
模板需要非类型参数的常量表达式。对于
一个const
变量用于常量表达式,它的变量
初始化必须对编译器可见。所以你可能会有
在header2.hpp中包含header1.hpp。
答案 1 :(得分:0)
header2必须对header2可见。模板化的类不知道如何实例化自己,除非它具有所有的定义。
答案 2 :(得分:0)
This answer告诉extern const
不起作用。
然而,我想到了一个解决方法:
更改header2.hpp以定义常量:
const int CONST_VALUE2 = 10;
更改源文件以检查常量:
#include "header2.hpp"
// implementation of B
static_assert( CONST_VALUE2 == CONST_VALUE1, "check the constant!" );
这样header2.hpp不必包含header1.hpp(仅在源文件中需要)。
答案 3 :(得分:0)
模板在编译时进行评估,因此必须知道所有模板参数并在此时保持不变。通过将变量声明为extern,编译器在评估模板时不会知道该值,从而给出您看到的错误。
编译模板时,您需要确保模板参数是已知值。