C++ 从模板结构中为类型添加别名
我将问题缩小为:C++ 从模板结构中为类型添加别名,c++,templates,visual-studio-2017,C++,Templates,Visual Studio 2017,我将问题缩小为: 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&
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;
模板结构{
结构水果基础{value\u t weight;};
结构香蕉:果基{};
柠檬结构:果基{};
使用fruit\u t=typename std::conditional::type;
};
使用香蕉结构=水果结构::水果结构的模板;
使用lemon\u struct=fruit\u structs::fruit\u t的模板;
实际上,banana_t和lemon_t共享许多逻辑和特定于价值的实用程序,因此我看到的选项要么是非常冗余的模板专门化,要么就是这个。问题是它不起作用,因此这篇文章
Intellisence在我尝试使用别名的最后一行中声明“语法错误:标识符'fruit'”。为什么会这样?编译器无法确定引用的是类型。通过在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;
使用香蕉结构的模板=typename fruit\u structs::fruit\t;
使用lemon\u struct=typename fruit\u structs::fruit\t的模板;
您就快到了,您只需要依赖类型上的typename
。