在 C++ 中出现“模板重新声明中的模板参数过多”错误

问题描述 投票:0回答:1

我正在尝试使用

std::enable_if
根据传递给它的枚举值有选择地启用类上的函数。这是我目前正在尝试的方法:

// class def
template<MyEnum E>
class ClassA {

// function
template <MyEnum EN = E, typename = std::enable_if_t<EN != MyEnum::some_value>>
void customFunction(double v);

当我在没有实际创建函数定义的情况下对其进行测试时,它工作正常并且自定义函数仅在枚举正确时才有效。问题是我似乎无法在我的 cpp 文件中定义它,就像做这样的事情:

template <MyEnum E, typename = std::enable_if_t<E != MyEnum::some_value>>
void ClassA<EN>::customFunction(double v) {}

给我错误

"Too many template parameters in template redeclaration"
。我知道我可以在我的头文件中定义它,但我觉得有更好的方法来做到这一点。

感谢您的帮助!

c++ oop templates polymorphism sfinae
1个回答
0
投票

在类外定义成员模板时需要添加单独的模板参数子句。另请注意,在定义成员模板时无需指定默认参数。

因此,修正后的程序应该是这样的:

enum MyEnum{some_value};
template<MyEnum E>
class ClassA {

template <MyEnum EN = E, typename = std::enable_if_t<EN != MyEnum::some_value>>
void customFunction(double v);
};

//this is the correct syntax to define the member template outside the class template
template <MyEnum E>
template<MyEnum EN, typename> //added this parameter clause
void ClassA<E>::customFunction(double v) {}

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.