"Failed to specialize alias template" 最简单的 SFINAE 布尔条件错误
"Failed to specialize alias template" errors for the most simple SFINAE bool condition
我正在尝试实现简单的条件实现,但失败了......我试过这个:
template<class T, bool COND=0> class A
{
public:
template< typename TT=T >
std::enable_if_t<!COND> METHOD() const { };
template< typename TT=T >
std::enable_if_t<COND> METHOD() const { };
};
还有这个:
template<class T, bool COND=0> class A
{
public:
template< typename TT=T, std::enable_if_t<!COND, int> = 0 >
void METHOD() const { };
template< typename TT=T, std::enable_if_t<COND, int> = 0 >
void METHOD() const { };
};
还有很多其他的......并且总是得到“无法专门化别名模板”。我做错了什么?
编辑:使用最新的 MSVC 2022,仅 A 将触发错误。
下面的呢?
template<class T, bool COND=0> class A
{
public:
template< bool CC=COND >
std::enable_if_t<!CC> METHOD() const { };
template< bool CC=COND >
std::enable_if_t<CC> METHOD() const { };
};
我的意思是...如果您想要 enable/disable class 到 std::enable_if
的方法,您必须检查依赖于模板(类型或值)的测试方法的,而不是 class.
所以
std::enable_if_t<!COND>
不起作用,因为 COND
是 class 的模板值;你必须使用该方法的模板值,所以你可以添加一个模板值 CC
,你可以默认为 COND
template< bool CC=COND >
并检查 CC
而不是 COND
std::enable_if_t<!CC>
我正在尝试实现简单的条件实现,但失败了......我试过这个:
template<class T, bool COND=0> class A
{
public:
template< typename TT=T >
std::enable_if_t<!COND> METHOD() const { };
template< typename TT=T >
std::enable_if_t<COND> METHOD() const { };
};
还有这个:
template<class T, bool COND=0> class A
{
public:
template< typename TT=T, std::enable_if_t<!COND, int> = 0 >
void METHOD() const { };
template< typename TT=T, std::enable_if_t<COND, int> = 0 >
void METHOD() const { };
};
还有很多其他的......并且总是得到“无法专门化别名模板”。我做错了什么?
编辑:使用最新的 MSVC 2022,仅 A
下面的呢?
template<class T, bool COND=0> class A
{
public:
template< bool CC=COND >
std::enable_if_t<!CC> METHOD() const { };
template< bool CC=COND >
std::enable_if_t<CC> METHOD() const { };
};
我的意思是...如果您想要 enable/disable class 到 std::enable_if
的方法,您必须检查依赖于模板(类型或值)的测试方法的,而不是 class.
所以
std::enable_if_t<!COND>
不起作用,因为 COND
是 class 的模板值;你必须使用该方法的模板值,所以你可以添加一个模板值 CC
,你可以默认为 COND
template< bool CC=COND >
并检查 CC
而不是 COND
std::enable_if_t<!CC>