C++中能否通过typedef简化私有继承的复杂基类声明?
问题解答
首先,C++不支持你给出的这种写法:
struct S : private typedef std::vector<int> Container {};
原因是语法规则限制:类的继承列表中只能放置类型说明符(比如具体类型名、已定义的类型别名),而typedef std::vector<int> Container是一条类型别名的定义语句,不属于合法的基类说明符,编译器会直接报错。
针对你的需求——用私有继承模拟has-a关系,同时给复杂基类起别名,这里提供两种简洁的非模板方案,完全解决你现有模板方式的问题:
方案1:外部定义类型别名(推荐)
先在类外部定义基类的别名,再用别名进行私有继承,既简化了代码,又不会将类变为模板:
// C++03及以后可用typedef typedef std::vector<int> Container; struct S : private Container {}; // C++11及以后更推荐using(支持模板别名,语法更直观) using Container = std::vector<int>; struct S : private Container {};
方案2:隐藏别名的封装方式
如果不想让Container别名暴露在全局作用域,可以用细节命名空间封装别名和中间基类:
namespace detail { using Container = std::vector<int>; struct Base : private Container {}; } struct S : private detail::Base {};
这两种方案都能让S保持为普通非模板类,既通过别名简化了复杂基类的写法,又不会误导使用者以为可以自定义容器类型,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者tommsch
相关产品推荐
相关产品推荐

