Specialization of Notype template of type enum- error: template argument is invalid
Specialization of Notype template of type enum- error: template argument is invalid
我有这样的代码:
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>
更改为 template<typename SceneT, GeneratorType 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");
你混合了一些东西:如果你想使用枚举作为非类型模板参数,你需要在模板声明中指定它,如下所示:
template<typename SceneT, GeneratorType TYPE>
class ODFrameGenerator
{
//... some APIS
};
现在,只要您使用 Device
而不是 GeneratorType::Device
,事情就可以正常进行了。要使用后一种形式,您需要将 GeneratorType 声明为枚举 class
enum class GeneratorType
{
FILE_LIST, DEVICE
};
我有这样的代码:
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>
更改为 template<typename SceneT, GeneratorType 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");
你混合了一些东西:如果你想使用枚举作为非类型模板参数,你需要在模板声明中指定它,如下所示:
template<typename SceneT, GeneratorType TYPE>
class ODFrameGenerator
{
//... some APIS
};
现在,只要您使用 Device
而不是 GeneratorType::Device
,事情就可以正常进行了。要使用后一种形式,您需要将 GeneratorType 声明为枚举 class
enum class GeneratorType
{
FILE_LIST, DEVICE
};