模板类中' is_base_of '的静态断言在MSVC中因类型意外而失败
Static assertion of `is_base_of` in templated class fails with unexpected type in MSVC
我想确保我的类的一个模板参数是从一个特定的(抽象)类派生的。为了这个目的,我写了
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)还是我错了,例如我如何解决这个问题?
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");
相关文章:
- 不正确的操作数类型 MSVC
- 使用 MSVC 调试类型
- MSVC 在不知道类型的情况下评估上下文(和错误)
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 键入特征以检查类型是否可从流和 MSVC 读取
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名
- 如果我的模板类型首先以lambda参数而发生,则MSVC会引起一个奇怪的错误
- MSVC:协变返回类型和虚拟继承
- MSVC 1 位枚举类型等于 -1,并且相等性测试失败
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- MSVC 错误,将 constexpr 数组作为模板非类型参数
- QT创建者和MSVC-忽略调试时特定的异常类型
- MSVC 19.11 / Visual C 2017:尺寸1和size_t类型的初始化列表误解
- 模板构造函数在 MSVC 中失败,因为成员函数与参数类型的名称冲突
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- 为什么MSVC会选择一个long long作为-2147483648的类型
- 在msvc中为uint8_t和类似类型包含或项目设置
- 从函子模板参数(特定于MSVC)中推导可变参数和返回类型
- 与msvc相比,类型擦除、委托和lambda函数
- 类型转换错误!在MSVC和GCC中都有