boost::enable_if_c error: is not a valid type for a template non-type parameter
boost::enable_if_c error: is not a valid type for a template non-type parameter
我想禁止为具有特定类型特征的类型实例化 class 模板 (PointCloud
)。在下面的示例中,我只想允许使用定义了 is_good
的类型:
#include <boost/core/enable_if.hpp>
class PointType1 {};
class PointType2 {};
template <typename T>
struct is_good
{
static const bool value = false;
};
template <>
struct is_good<PointType1>
{
static const bool value = true;
};
template <typename TPoint, typename boost::enable_if_c<is_good<TPoint>::value>::type = 0>
class PointCloud
{
};
int main()
{
PointCloud<PointType1> pointCloud1;
//PointCloud<PointType2> pointCloud2;
return 0;
}
错误是:
error: 'boost::enable_if_c<true, void>::type {aka void}' is not a valid type for a template non-type parameter
PointCloud<PointType1> pointCloud1;
^
根据我的理解,如果 is_good<TPoint>::value
是 true
,enable_if_c
应该将 ::type
定义为 TPoint
。如果它是 false
,则 ::type
未定义,因此 SFINAE 应该启动。我还认为 typename
表示这确实是一个类型参数。
谁能解释为什么会这样?
当您实例化 PointCloud<PointType1>
时,is_good<TPoint>::value
是 true
并且 boost::enable_if_c<is_good<TPoint>::value>::type
是 void
。
如错误消息所述,void
不是 non-type template parameter 的有效类型。
要修复错误,请为 enable_if_c
指定第二个类型参数,而不是使用默认参数 void
template <typename TPoint,
typename boost::enable_if_c<is_good<TPoint>::value, int>::type = 0>
^^^^^
我想禁止为具有特定类型特征的类型实例化 class 模板 (PointCloud
)。在下面的示例中,我只想允许使用定义了 is_good
的类型:
#include <boost/core/enable_if.hpp>
class PointType1 {};
class PointType2 {};
template <typename T>
struct is_good
{
static const bool value = false;
};
template <>
struct is_good<PointType1>
{
static const bool value = true;
};
template <typename TPoint, typename boost::enable_if_c<is_good<TPoint>::value>::type = 0>
class PointCloud
{
};
int main()
{
PointCloud<PointType1> pointCloud1;
//PointCloud<PointType2> pointCloud2;
return 0;
}
错误是:
error: 'boost::enable_if_c<true, void>::type {aka void}' is not a valid type for a template non-type parameter
PointCloud<PointType1> pointCloud1;
^
根据我的理解,如果 is_good<TPoint>::value
是 true
,enable_if_c
应该将 ::type
定义为 TPoint
。如果它是 false
,则 ::type
未定义,因此 SFINAE 应该启动。我还认为 typename
表示这确实是一个类型参数。
谁能解释为什么会这样?
当您实例化 PointCloud<PointType1>
时,is_good<TPoint>::value
是 true
并且 boost::enable_if_c<is_good<TPoint>::value>::type
是 void
。
如错误消息所述,void
不是 non-type template parameter 的有效类型。
要修复错误,请为 enable_if_c
指定第二个类型参数,而不是使用默认参数 void
template <typename TPoint,
typename boost::enable_if_c<is_good<TPoint>::value, int>::type = 0>
^^^^^