2012-05-18 113 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; 
相关问题