C++中“using 类名<模板参数>::函数名;”语句的含义与作用
C++中
using ClassName<arg1, arg2>::functionName;的含义及用法 你遇到的这种不带=的using声明,和用来定义类型别名的using(比如using Int = int;)是完全不同的语法,它的核心作用是把指定类(这里是实例化后的ClassName<arg1, arg2>)中的functionName成员直接引入到当前类或作用域中,具体可以从以下场景理解:
1. 解决派生类对基类成员的隐藏问题
当派生类定义了和基类同名的成员时,基类的同名成员会被默认隐藏。通过这种using声明,你可以把基类的成员“拉”到派生类的作用域里,这样外部代码访问派生类对象时,既能访问派生类自己的同名成员,也能访问基类的版本;派生类内部使用该成员时,也不用每次都加基类名::的限定符。
2. 模板类中引入依赖基类的成员
看你给出的代码示例:
template <typename A, typename B, typename C, typename D> class MyClass{ public: using AnotherClass<A,B,C>::functionName; // ... }
这里AnotherClass<A,B,C>是一个依赖MyClass模板参数的基类。C++模板的编译规则里,编译器不会主动去依赖基类中查找非限定名的成员,所以必须通过using声明明确把functionName引入到MyClass的作用域中。这样不管是在MyClass内部使用,还是外部通过MyClass对象调用,都能直接找到基类里的这个成员函数,不用每次都写冗长的AnotherClass<A,B,C>::functionName。
和类型别名using的本质区别
- 带
=的using:是类型别名声明,给已有的类型起一个新名字,比如using StringList = std::vector<std::string>;,本质是定义类型的别名。 - 不带
=的using:是成员引入声明,把其他类(大多是基类)的成员函数、成员变量或嵌套类型,引入到当前作用域,让它们能像当前类自身的成员一样被访问。
额外补充
- 这种
using声明不止能引入成员函数,基类里的成员变量、嵌套的类型定义(比如基类里的typedef或using类型别名)都可以用它引入。 - 如果基类里的
functionName有多个重载版本,using声明会一次性把所有重载版本都引入到当前作用域中。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

