gpt4 book ai didi

c++ - 在不同的header中安排模板相关的代码

转载 作者:行者123 更新时间:2023-11-28 08:06:48 24 4
gpt4 key购买 nike

只要我将其全部保存在“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;
};

现在,这些值可用作包含此类定义的任何翻译单元中的模板参数。

关于c++ - 在不同的header中安排模板相关的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com