c++ type_traits:为什么我不能从另一个模板/enable_if 行调用模板化静态方法?
c++ type_traits: Why can't I call templated static methods from another template / enable_if line?
我想在 enable_if 表达式中的函数的模板参数中使用静态方法。但是,静态方法也是一个模板,我会遇到编译错误。
错误信息:
$ g++ test.cpp
test.cpp:20:36: error: invalid declarator before ‘(’ token
20 | std::enable_if_t<A::method_a<param>()>
代码示例:
#include <type_traits>
struct B
{
template<int param>
static constexpr int method_a()
{
return param == 5;
}
static constexpr int method_b(int param)
{
return param == 5;
}
};
// this doesn't work
template<int param, typename A>
std::enable_if_t<A::method_a<param>()>
func_a(A& a)
{}
// this works
template<int param, typename A>
std::enable_if_t<A::method_b(param)>
func_b(A& a)
{}
int main()
{
B b;
func_b<5>(b); // this doesn't work
func_a<5>(b); // this works
return 0;
}
在func_a
中,名称method_a
是一个从属名称,即method_a
的含义取决于模板类型参数A
。如果名称是成员模板,则需要使用 template
关键字指定:
template<int param, typename A>
std::enable_if_t<A::template method_a<param>()>
// ^^^^^^^^
func_a(A& a){}
这里是 demo。
我想在 enable_if 表达式中的函数的模板参数中使用静态方法。但是,静态方法也是一个模板,我会遇到编译错误。
错误信息:
$ g++ test.cpp
test.cpp:20:36: error: invalid declarator before ‘(’ token
20 | std::enable_if_t<A::method_a<param>()>
代码示例:
#include <type_traits>
struct B
{
template<int param>
static constexpr int method_a()
{
return param == 5;
}
static constexpr int method_b(int param)
{
return param == 5;
}
};
// this doesn't work
template<int param, typename A>
std::enable_if_t<A::method_a<param>()>
func_a(A& a)
{}
// this works
template<int param, typename A>
std::enable_if_t<A::method_b(param)>
func_b(A& a)
{}
int main()
{
B b;
func_b<5>(b); // this doesn't work
func_a<5>(b); // this works
return 0;
}
在func_a
中,名称method_a
是一个从属名称,即method_a
的含义取决于模板类型参数A
。如果名称是成员模板,则需要使用 template
关键字指定:
template<int param, typename A>
std::enable_if_t<A::template method_a<param>()>
// ^^^^^^^^
func_a(A& a){}
这里是 demo。