c++ - 使用 VS 公共(public)继承进行模板化

标签 c++ templates using

<分区>

我相信添加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;

我相信 ClassXClassY 应该是完全一样的东西,但是 ClassX 会导致编译错误。所以我的问题是:我违反了 C++ 标准的哪一部分?

顺便说一句,我使用的是支持 XP (v140_xp) 的 MSVC 2015 工具集。

最佳答案

您缺少 typename 关键字:

template <class T1, class T2>
using ClassX = typename OneOfTwo<T1::X == T2::X, C, D>::type;

关于c++ - 使用 VS 公共(public)继承进行模板化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957658/

相关文章:

c++ - 在类声明之前在模板内进行 `using` 声明

c# - 调用 Dispose() 与对象超出范围/方法完成时的对比

无法命名的 C++ 类型

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 应该在游戏循环 C++ 中调用 std::async 吗?

C++在构造函数中初始化一个非静态指针数组

templates - 使用数组将MapResult转换为数组

c# - StreamReader与using语句的区别?

c++ - 类函数中数组的长度

c++ - 如何为我的语言编写自己的 Windows 输入工具软件?