使用VS公共继承模板化
templated using VS public inheritance
我相信添加using
关键字是为了允许模板类型定义。然而,我遇到了一个编译错误,这里是简化的代码:
template <bool EnableFirst, class T1, class T2>
struct OneOfTwo {};
template <class T1, class T2>
struct OneOfTwo<true, T1, T2>
{
using type = T1;
};
template <class T1, class T2>
struct OneOfTwo<false, T1, T2>
{
using type = T2;
};
struct A
{
static constexpr int X = 1;
};
struct B
{
static constexpr int X = 12;
};
struct C {};
struct D {};
template <class T1, class T2>
using ClassX = OneOfTwo<T1::X == T2::X, C, D>::type; //C4346: 'T2::X': dependent name is not a type; C2061: syntax error: identifier 'type'
template <class T1, class T2>
struct ClassY : public OneOfTwo<T1::X == T2::X, C, D>::type {}; //OK
我这样使用这些类:
ClassY<A, B> y;
ClassX<A, B> x;
我认为ClassX
和ClassY
应该是完全一样的东西,但是ClassX
会导致编译错误。所以我的问题是:我打破了C++标准的哪一部分?
顺便说一句,我使用的是支持XP的MSVC 2015工具集(v140_XP)。
您缺少一个typename
关键字:
template <class T1, class T2>
using ClassX = typename OneOfTwo<T1::X == T2::X, C, D>::type;
using
关键字在其定义中需要类型:
using ABC = SomeClass;
但ABC
不是类型,它是类型别名(也称为typename
)。。。
所以,这条线失败了:
using ClassX = OneOfTwo<T1::X == T2::X, C, D>::type;
C4346:'T2::X':依赖名称不是类型;C2061:语法错误:标识符"type">
此错误的更准确表示为:
错误:
typename
不是class
。。。
typename是类型别名的说明符,可以是任何,从int
s到void*
s到任何。。。但一个阶级有它自己的身份。。。这是一个类。。。
因此,为了修复您的错误,您必须在类型别名之前指定typename
。。。
// Adding the 'typename' keyword is also needed for nested classes, according to YSC
using ClassX = typename OneOfTwo<T1::X == T2::X, C, D>::type;
阅读:键入别名
编辑:这样做也会产生相同的结果:
template <class T1, class T2>
struct OneOfTwo<false, T1, T2>
{
typedef T2 type;
}
不过,在typedef
中,您不能像使用using
那样创建类型别名的别名,因此using
具有优势。。。
注意:根据建议:添加"typename"被认为是多余的,因为C++20…
相关文章:
- 继承函数的重载解析
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么在保护模式下继承升级不起作用
- 数据成员SFINAE的C++17测试:gcc vs clang
- 通过继承类使用来自不同命名空间的运算符
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- 在继承多个空类时,了解GCC/Clang vs MSVC2015之间的不同填充规则
- C 多重继承和向上的智能指针破坏会导致VS 2017中的堆腐败
- 使用VS公共继承模板化
- 继承自 std::true_type vs static constexpr const bool 成员
- 最佳继承层次结构,例如:Model3D -> ModelAnimation VS ModelAnimation or Model3D -> ModelAnimation
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- 私有继承vs暴露迭代器
- 多态性vs常规继承
- 注入vs.继承
- visual c++在vs 2010中出现了模糊继承错误
- 继承vs类模板专门化.设计的家伙