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'|
4

1 に答える 1

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;
};

これで、このクラス定義を含む任意の翻訳単位でテンプレート引数として値を使用できるようになりました。

于 2012-04-13T14:04:12.213 に答える