在不同的标头中排列与模板相关的代码
Arranging template related code in different headers
下面的
代码只要我把它全部保存在"main.cpp"文件中就可以工作。
//#include "Travel.h"
//#include "Obj.h"
// "Travel.h"
typedef int travel_t;
class Travel
{
public:
static const travel_t AIR;
static const travel_t WATER;
static const travel_t LAND;
};
// "Travel.cpp"
// #ifndef TRAVEL_H
// #define TRAVEL_H
//
// #include "Travel.h"
const travel_t Travel::AIR = -2;
const travel_t Travel::WATER = -1;
const travel_t Travel::LAND = 0;
// #endif //TRAVEL_H
// "Obj.h"
// #ifndef OBJ_H
// #define OBJ_H
//
//#include "Travel.h"
template<typename T, travel_t travel>
class Obj
{
public:
void foo(){};
};
// #endif //OBJ_H
// "main.cpp"
int main()
{
Obj<int, Travel::AIR> objAirTravel;
objAirTravel.foo();
return 0;
}
但是,一旦我按照指示将代码移动到不同的标头和实现文件,它就不再编译了。我该如何解决这个问题?它背后的问题/规则是什么?这是我得到的编译器错误(使用 gcc):
main.cpp|45|error: 'Travel::AIR' is not a valid template argument for type 'int' because it is a non-constant expression|
main.cpp|45|error: invalid type in declaration before ';' token|
main.cpp|47|error: request for member 'foo' in 'objAirTravel', which is of non-class type 'int'|
为了将常量用作模板参数,其值必须在当前翻译单元中可用。将Travel::Air
的定义移动到其他源文件时,编译器在 main
中不再可以使用其值。
由于它是一个整数常量,因此您可以在类内的声明中声明值:
class Travel
{
public:
static const travel_t AIR = -2;
static const travel_t WATER = -1;
static const travel_t LAND = 0;
};
现在,这些值可用作包含此类定义的任何翻译单元中的模板参数。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 为什么不;名字在地图上是按顺序排列的吗
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 添加气泡排序代码以排列列表
- 为什么这段代码没有生成所有的排列?
- 重新排列代码行时未引发错误"Double free or corruption"
- C++编码代码 青蛙河一号在大型排列测试中失败
- 在不同的标头中排列与模板相关的代码
- LLVM clang编译器优化器以一种非常奇怪的方式重新排列代码,该怎么做
- 关于歧义排列的代码问题
- 在C和c++中声明和排列代码的习惯