如何将 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 只能看到完全实例化的模板主体 类 和函数。编译器只能看到给定编译单元中的代码。
因此,即使 int
是 extern const
并在某个编译单元中赋值(使其在 运行 时有效),它也不可能用作任何其他编译单元中的模板参数。编译器在解析哪些模板实例化引用相同类型时无法知道 int
的值。
你最有可能得到的最接近的是,你可以将指向 int
的指针作为模板参数,然后如果你有,例如使用 运行 在 运行 时间的模板参数的函数,它可以取消引用指针以获得常量值。如果您启用了 link 时间优化,它甚至可能内联它,我不确定。
我有以下 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 只能看到完全实例化的模板主体 类 和函数。编译器只能看到给定编译单元中的代码。
因此,即使 int
是 extern const
并在某个编译单元中赋值(使其在 运行 时有效),它也不可能用作任何其他编译单元中的模板参数。编译器在解析哪些模板实例化引用相同类型时无法知道 int
的值。
你最有可能得到的最接近的是,你可以将指向 int
的指针作为模板参数,然后如果你有,例如使用 运行 在 运行 时间的模板参数的函数,它可以取消引用指针以获得常量值。如果您启用了 link 时间优化,它甚至可能内联它,我不确定。