模板化类中的`is_base_of`的静态断言在MSVC中以意外类型失败

时间:2015-08-19 12:24:36

标签: c++ templates visual-c++ generic-programming

我想确保我的类的一个模板参数是从特定(抽象)类派生的。有了这个意图就写了这个

class abstract_record
    {};
        template<typename Record, typename Container = std::vector>  //requires SequenceContainer<Container> //See ISO/IEC PRF TS 19217
    class mddb_adapter : public Wt::WAbstractTableModel
    {
        static_assert(std::is_base_of<abstract_record, Record>,"Record must be derived of MDDB_Service::MDDB_Web::abstract_record");
...

但是我收到编译错误:

  

error C2226: syntax error : unexpected type 'std::is_base_of<abstract_record,Record>'

这是MSVC的问题(我使用的是Visual Studio 2013 Express)还是我遇到了问题,例如我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

is_base_of验证的结果可通过静态嵌套value数据成员访问:

static_assert(std::is_base_of<abstract_record, Record>::value
//                                                    ~~~~~~^
     , "Record must be derived of MDDB_Service::MDDB_Web::abstract_record");

如果您的编译器支持转换运算符的constexpr评估,则可以使用以下语法:

static_assert(std::is_base_of<abstract_record, Record>{}
//                                                    ↑↑
     , "Record must be derived of MDDB_Service::MDDB_Web::abstract_record");