如何不使用类名和作用域解析符调用自定义类的静态成员方法
核心原因说明
- 首先明确:向
std命名空间插入自定义类属于C++标准规定的未定义行为,标准仅允许用户向std中添加标准模板的自定义特化,不要随意向std加入自定义的类、函数等实体。 using namespace 命名空间名的作用仅为将对应命名空间的顶层实体引入到当前作用域,不会递归引入命名空间内嵌套的实体,更不会自动把类内部的成员导出到外层作用域。你代码里的foo()是类A的静态成员,属于A的内部作用域,因此using namespace std只能把A引入当前作用域(所以A::foo()可以调用),但不会把A::foo也导出到外层,所以直接调用foo()会报错。
实现方案
你要实现和std::sort()调用一致的效果,有两种合法的实现方式:
方案1:直接把函数定义在命名空间顶层(和std::sort的实现逻辑一致)
std::sort本身就是std命名空间下的顶层函数,不属于任何类,所以using namespace std之后可以直接调用。你也可以参考这个逻辑实现:
#include <iostream> // 自定义命名空间,不要用std namespace myns { void foo() { std::cout << "foo"; } } using namespace myns; int main () { foo(); // 可以正常调用,和std::sort的使用效果完全一致 return 0; }
方案2:单独用using声明导出类的静态成员
如果你确实需要把函数封装为类的静态成员,可以单独用using声明把指定静态成员引入当前作用域:
#include <iostream> namespace myns { class A { public: static void foo() { std::cout << "foo"; } }; } // 单独引入类的静态成员 using myns::A::foo; int main () { foo(); // 可以正常调用 return 0; }
注意事项
不建议在头文件的全局作用域使用using namespace指令,容易引发不同命名空间的同名实体冲突,最好仅在cpp文件的局部作用域按需使用。
内容的提问来源于stack exchange,提问作者Scripter
相关产品推荐
相关产品推荐

