从模板结构中别名类型

aliasing a type from a template struct

我将问题缩小为:

template <typename value_t, bool citrus = false> struct fruit_structs {
    struct fruit_base { value_t weight; };
    struct banana_t : fruit_base {};
    struct lemon_t : fruit_base {};

    using fruit_t = typename std::conditional<citrus, lemon_t, banana_t>::type;
};

template<typename value_t> using banana_struct = fruit_structs<value_t, false>::fruit_t;
template<typename value_t> using lemon_struct = fruit_structs<value_t, true>::fruit_t;

实际上,banana_t 和 lemon_t 共享很多逻辑和 value_t 特定的实用程序,所以我看到它们的选项要么是一个可怕的冗余模板专业化,要么就是这个。问题是它不起作用,因此 post.

Intellisence 在我尝试别名的最后几行声明“语法错误:标识符 'fruit_t'”。这是为什么?

你的编译器不能确定你引用的是一个类型。通过在 typename 关键字前面加上明确的:

template<typename value_t> using banana_struct = typename fruit_structs<value_t, false>::fruit_t;

template<typename value_t> using lemon_struct = typename fruit_structs<value_t, true>::fruit_t;