如何将 C++ 外部常量变量用于不同文件中的模板参数

How to use a C++ extern constant variable for a template argument in a different file

我有以下 5 个文件:global_vars.h、global_vars.cpp content.h content.cpp main.cpp.

global_vars.h

#ifndef global_vars_h
#define global_vars_h

namespace Constants{

    extern const unsigned int b;

}

#endif

global_vars.cpp

#include "global_vars.h"

namespace Constants{

    extern const unsigned int b(5);


}

content.h

#ifndef CONTENT_H_
#define CONTENT_H_

#include "global_vars.h"
#include <bitset>

struct a{

    std::bitset<Constants::b> s;
    int a=10;

};

#endif

content.cpp

#include "content.h"

a xVar;

main.cpp

#include "content.h"
int main(){
   return 0;
}

我收到以下错误:

In file included from content.cpp:1:0:
content.h:11:31: error: the value of ‘Constants::b’ is not usable in a constant expression

In file included from content.h:4:0,
from content.cpp:1:
global_vars.h:6:28: note: ‘Constants::b’ was not initialized with a constant expression
extern const unsigned int b;

我还必须在 content.cpp/.h(对于其他位集)以外的文件中使用 Constants::b,那么我该怎么做呢?感谢帮助。

谢谢

你问的不可能。

在 C++ 中,模板完全由编译器解析,linker 只能看到完全实例化的模板主体 类 和函数。编译器只能看到给定编译单元中的代码。

因此,即使 intextern const 并在某个编译单元中赋值(使其在 运行 时有效),它也不可能用作任何其他编译单元中的模板参数。编译器在解析哪些模板实例化引用相同类型时无法知道 int 的值。

你最有可能得到的最接近的是,你可以将指向 int 的指针作为模板参数,然后如果你有,例如使用 运行 在 运行 时间的模板参数的函数,它可以取消引用指针以获得常量值。如果您启用了 link 时间优化,它甚至可能内联它,我不确定。