Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用名称空间避免长路径 我还在学习C++,我以前从来没有真正创建过自己的命名空间。我在用它们做实验,虽然我有很多事情要做,但有一件事我似乎仍然做不到。我希望能够在类中调用静态方法,而无需键入类似于NameOfClass::method的内容。我认为代码应该是这样的,但它无法编译:_C++_Namespaces_Using - Fatal编程技术网

C++;使用名称空间避免长路径 我还在学习C++,我以前从来没有真正创建过自己的命名空间。我在用它们做实验,虽然我有很多事情要做,但有一件事我似乎仍然做不到。我希望能够在类中调用静态方法,而无需键入类似于NameOfClass::method的内容。我认为代码应该是这样的,但它无法编译:

C++;使用名称空间避免长路径 我还在学习C++,我以前从来没有真正创建过自己的命名空间。我在用它们做实验,虽然我有很多事情要做,但有一件事我似乎仍然做不到。我希望能够在类中调用静态方法,而无需键入类似于NameOfClass::method的内容。我认为代码应该是这样的,但它无法编译:,c++,namespaces,using,C++,Namespaces,Using,文件A.h namespace Test { class A { public: static int foo() { return 42; } }; } 文件main.cpp #include <iostream> #include "A.h" using namespace std; using namespace Test::A; int main() { cout << foo() &

文件
A.h

namespace Test
{
    class A
    {
        public:
            static int foo() { return 42; }
    };
}
文件
main.cpp

#include <iostream>

#include "A.h"

using namespace std;
using namespace Test::A;

int main()
{
    cout << foo() << endl;

    return 0;
}

如果不键入
A::foo
,是否可以执行我正在尝试执行的操作?

没有办法,您需要为静态方法指定类名

using namespace Test;
然后:


不,你不可能以任何优雅的方式去做你想做的事情。您能做的最接近的事情是创建一个宏或一个内联函数,它将委托给您的函数。然而,这两种选择都相当丑陋,所以我不打算发布任何代码示例。只需咬紧牙关,指定整个名称,或者重构代码,使静态方法只是全局函数。

C++,您/特别是/必须仔细阅读编译器错误消息。 请注意,第一个错误是“error:'A'不是名称空间名称”。没错,A是一个类名

using namespace Foo; // brings in  all of foo;
using Bar::Baz // brings in only Baz from Bar
你想写:

using Test::A;
这有两个好处:它为您带来了一个可供使用的测试,而它并没有带来测试的所有其余部分,这也很好,因为您应该只带来您需要的,这样就不会意外地依赖于您没有意识到您所依赖的东西

但是,由于foo在A中是静态的,因此仍然必须显式地引用A::foo。(除非您编写一个转发到::foo的自由函数;一般来说,如果您只是为了节省一些输入,那么这是一个坏主意。)

有些人可能建议根本不要使用声明,而是完全限定所有名称

但这(引用Stroustrup的话)“冗长且容易出错”,并且妨碍了重构:假设您完全限定了FooMatic::Stack类的每一次使用,然后管理层在您即将投入生产之前坚持使用BarMatic非常类似的Stack类,因为BarMatic刚刚收购了您的公司

如果你在任何地方都取得了资格,你会做很多事情,希望你的正则表达式是正确的。如果您使用了using声明,那么您可以对(希望是共享的)头文件进行修复。通过这种方式,using声明非常类似于“typedef int-ourInt;”或manifest常量或const:“const int FOO=1;”,因为它提供了一个位置来更改引用到多个位置的内容。在每次使用时完全限定名称空间将失去这一好处

相反,如果您使用using指令并引入所有名称空间FooMatic,那么您的grep可能会更加困难,如果说管理层坚持使用BarMatic::Foo,但您仍然必须使用FooMatic:Baz,无论出于何种原因,Baz的BarMatic等价物都无法使用

因此,一次引入一种类型(类、函数、常量)通常是最灵活的,这是保护自己免受不可避免但尚未可知的变化影响的最佳方式。与大多数编码一样,您希望在保持足够粒度的同时尽量减少繁琐的重复

不要成为“使用命名空间”的滥用者。使用那些名称空间

std::cout << Test::A::foo() << std::endl;

std::难道我相信你的意思是,“你总是必须仔细阅读编译器错误消息”。有很多工具可以很好地进行重构;不需要正则表达式。我几乎从不使用“using”声明,因为它污染了全局名称空间,这对我来说是一个更糟糕的问题。重构实际上不是问题。
using Test::A;
std::cout << Test::A::foo() << std::endl;