boost :: enable_if_c错误:不是模板非类型参数的有效类型

时间:2016-01-19 20:28:32

标签: c++ templates boost sfinae enable-if

我想禁止为具有特定类型特征的类型实例化类模板(setUp())。在以下示例中,我只想允许使用定义了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; ^ enable_if_c,则::type应将TPoint定义为is_good<TPoint>::value。如果是true,则false未定义,因此SFINAE应该启动。我还认为::type表示这确实是一个类型参数。

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

当您实例化is_good<TPoint>::value时,trueboost::enable_if_c<is_good<TPoint>::value>::typevoidvoid

正如错误消息所示,void不是non-type template parameter的有效类型。

要修复错误,请为enable_if_c指定第二个类型参数,而不是使用默认参数template <typename TPoint, typename boost::enable_if_c<is_good<TPoint>::value, int>::type = 0> ^^^^^

private var _loggedIn = NSUserDefaults.standardUserDefaults().boolForKey("loggedIn")
public var loggedIn: Bool {
    get {
        return _loggedIn
    }
    set {
        _loggedIn = newValue
         NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "loggedIn")
         NSUserDefaults.standardUserDefaults().synchronize()
    }
}