2012-05-18 37 views
1

我有一個Visual Studio 2008 C++ 03應用程序,我在其中向類Foo提供策略FooTraits如何創建一個定義了固定值類型的策略模板

struct FooTraits 
{ 
    enum { FooVal = 1 }; 
}; 

template< typename traits > 
class Foo 
{ 
public: 
    typedef typename traits::FooVal foo_val; // errors on this line 

    void FooDo(UINT matrix[ foo_val ]) { /*...*/ }; 
}; 

typedef Foo<FooTraits> Foot; 

int main(int argc, char* argv[]) 
{ 
    Foot f; 
    UINT matrix[ Foot::foo_val ] = { /*...*/ }; 
    f.FooDo(matrix); 
    return 0; 
} 

但是,我得到的所有的typedef一個全系列的編譯器錯誤:

error C2146: syntax error : missing ';' before identifier 'foo_val' 
error C2838: 'FooVal' : illegal qualified name in member declaration 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

什麼是創建一個定義一個固定值策略的正確方法是什麼?

回答

1

通過enum引入的enumberated值都沒有,本身的類型。但是enum本身就是。因此,在:

enum Dummy { FooVal = 1 }; 

Dummy是類型,而不是FooVal。你可以typedefDummy,即:

struct FooTraits 
{ 
    enum Dummy { FooVal = 1 }; 
}; 

/* ... */ 

template< typename traits > 
class Foo 
{ 
public: 
    typedef typename traits::Dummy dummy; 
    }; 

但是你不能typedefFooVal,因爲它不是一個類型。試圖typedefFooVal無異是想做到這一點:

int foo = 42; 
typedef FooBar foo; 

...這,當然,是沒有意義的。

這裏是你的代碼,固定:

struct FooTraits 
{ 
    enum { FooVal = 1 }; 
}; 

template< typename traits > 
class Foo 
{ 
public: 
    void FooDo(unsigned matrix[ traits::FooVal]) { matrix;/*...*/ }; 
}; 

typedef Foo<FooTraits> Foot; 

int main() 
{ 
    Foot f; 
    unsigned matrix[ FooTraits::FooVal ] = { /*...*/ }; 
    f.FooDo(matrix); 
    return 0; 
} 
2

FooTraits::FooVal不是一種類型。這是枚舉的一個可能值。你不能鍵入一些不是類型的東西。您需要decltype(FooTraits::FooVal),或者給出枚舉的名稱。

0

因爲它不是type,所以不能鍵入定義traits::FooVal

使用此語法:

static const int foo_val = traits::FooVal; 
相關問題