2012-04-13 36 views
0

只要我将它全部保存在“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'| 

回答

1

为了使用一个常数作为模板参数,其当你将Travel::Air的定义移动到一个不同的源文件时,它的值在main的编译器中不再可用

由于它是一个整数常量,因此可以声明该值在类中声明:

class Travel 
{ 
public: 
    static const travel_t AIR = -2; 
    static const travel_t WATER = -1; 
    static const travel_t LAND = 0; 
}; 

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

+0

太棒了!我以为我曾尝试过,编译器也不喜欢它。但我最明显是错的。我想说,我缺乏经验。快速而彻底的答复非常感谢。我现在很清楚。这类问题再也不会让我感到困扰。 :-) – AudioDroid 2012-04-13 15:26:39

相关问题