2015-06-22 31 views
0

我有这样的代码:在认定中,以template<typename SceneT, GeneratorType TYPE>型enum-错误的NoType在模板的专业化:模板参数无效

enum GeneratorType 
    { 
    FILE_LIST, DEVICE 
    }; 

    template<typename SceneT, int TYPE> 
    class ODFrameGenerator 
    { 
    //... some APIS 
    }; 

    template<typename SceneT> 
    class ODFrameGenerator<SceneT, GeneratorType::DEVICE> 
    { 
    //...specialization: ERROR: template argument 2 is invalid 
    }; 

    template<typename SceneT> 
    class ODFrameGenerator<SceneT, 1> 
    { 
    //...specialization: compiles fine!! 
    }; 

我试图改变template<typename SceneT, int TYPE>但仍北京时间给出确切的同样的错误。任何想法什么是错的,以及如何避免这种情况?

注意:这是编译与c + + 11(与-std = c + + 11标志);但是否则失败。我正在使用gcc 4.9.2。

编辑:确切的错误我得到的是以下几点:

/home/sarkar/opendetection/common/utils/ODFrameGenerator.h:80:61: error: template argument 2 is invalid 
    class ODFrameGenerator<ODSceneImage, GeneratorType::DEVICE> 
                  ^
/home/sarkar/opendetection/common/utils/ODFrameGenerator.h:100:46: error: wrong number of template arguments (1, should be 2) 
    class ODFrameGenerator<ODScenePointCloud<> >, GeneratorType::DEVICE> 
              ^
/home/sarkar/opendetection/common/utils/ODFrameGenerator.h:28:9: error: provided for ‘template<class SceneT, int TYPE> class od::ODFrameGenerator’ 
    class ODFrameGenerator 
     ^
/home/sarkar/opendetection/examples/objectdetector/od_image_camera.cpp: In function ‘int main(int, char**)’: 
/home/sarkar/opendetection/examples/objectdetector/od_image_camera.cpp:28:67: error: template argument 2 is invalid 
    od::ODFrameGenerator<od::ODSceneImage, od::GeneratorType::DEVICE> frameGenerator("0"); 
                   ^
/home/sarkar/opendetection/examples/objectdetector/od_image_camera.cpp:28:83: error: invalid type in declaration before ‘(’ token 
    od::ODFrameGenerator<od::ODSceneImage, od::GeneratorType::DEVICE> frameGenerator("0"); 
+2

是您获得的* exact *错误吗?它是*完整*吗? *未经编辑*? –

+0

@JoachimPileborg,我添加了我得到的确切的错误。 – krips89

回答

3

你混合几件事情:如果你想使用枚举不键入你需要在模板声明中指定它的模板参数,像这样:

template<typename SceneT, GeneratorType TYPE> 
class ODFrameGenerator 
{ 
    //... some APIS 
}; 

现在,事情可以工作只要你使用Device,而不是GeneratorType::Device。要使用后一种形式,您需要将枚举类型声明为枚举类

enum class GeneratorType 
{ 
    FILE_LIST, DEVICE 
}; 
+1

自从C++ 11以来,它也被允许通过enum_name :: enumerator来命名* unscoped *枚举的枚举器。一个* scoped *枚举('enum class')不是必需的。这并不意味着当然没有范围枚举的其他好处。 – dyp

+0

谢谢,使用DEVICE代替GeneratorType :: DEVICE解决了这个问题。现在,当我将'SceneT'专门化为模板类的实例时,例如'类ODFrameGenerator >,DEVICE>'它说错了模板参数的数目(1,应该是2)'(错误#2问题)。任何想法有什么不对? – krips89

+0

我的不好,第二个错误是由于其他原因。谢谢你的帮助。 – krips89