如何在子类中使用模板基类的嵌套类型?
问题
我有如下代码:
template <typename T> struct bar { typedef T type; }; template <typename T> struct sub_bar : bar<T> { typename bar<T>::type x; };
我知道这是推荐写法,但我想写成如下形式:
template<typename T> struct sub_bar : bar<T> { ... type x; };
该如何实现?我尝试了如下写法:
template<typename T> struct sub_bar : bar<T> { typedef typename bar<T>::type type; type x; };
这里的type是否存在歧义?不过这段代码在gcc9编译器中可以正常运行。
解答
你尝试的写法是可行的,这里的type不存在歧义。
当你在sub_bar内部定义typedef typename bar<T>::type type;时,这个type属于当前类的作用域。在类内部直接使用type时,编译器会优先查找当前类作用域的名字,不会去基类bar<T>中查找——除非你明确使用this->或者基类限定符。因此代码里的type x;会被解析为你在sub_bar中定义的类型别名,和基类的type不会产生冲突,gcc9能正常编译是符合C++标准的。
另外,C++11及以后还可以用using语法简化写法,直接将基类的type引入当前类作用域,效果完全一致:
template<typename T> struct sub_bar : bar<T> { using typename bar<T>::type; type x; };
这种写法无需重新定义类型别名,代码更简洁直观。
内容的提问来源于stack exchange,提问作者Սոկրատ Գալստյան
相关产品推荐
相关产品推荐

