Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++_Class_Namespaces - Fatal编程技术网

C++ 在命名空间中的类中,我是否可以退出**仅**类命名空间?

C++ 在命名空间中的类中,我是否可以退出**仅**类命名空间?,c++,class,namespaces,C++,Class,Namespaces,此代码不编译: class A; void foo(A&) { } class A { void foo() { foo(*this); ///This does not compile } }; 错误: error: no matching function for call to 'A::foo(A&)' foo(*this); ^ note: candidate is: note:

此代码不编译:

class A;

void foo(A&) {
}

class A {
    void foo() {
        foo(*this); ///This does not compile
    }
};
错误:

error: no matching function for call to 'A::foo(A&)'
         foo(*this);
                  ^
note: candidate is:
note: void A::foo()
这可以通过调用
::foo(*This)来解决


但是,让我们考虑一下我们在命名空间中的情况:

namespace bar {

    class A;

    void foo(A&) {
    }

    class A {
        void foo() {
            foo(*this); ///This does not compile
        }
    };

}
除了显式调用
bar::foo(*this)之外,还有其他方法吗?我的意思是,有没有办法在下一个周围的声明性区域中查找名称,即包含
bar
名称空间

用例与我们看到的类似

我的意思是,有没有办法在下一个声明区域中查找名称, i、 e.包含
条的
名称空间

没有

你可以用另一种方式:

void foo() {
    using bar::foo;
    foo(*this); /// OK now
}
我的意思是,有没有办法在下一个声明区域中查找名称, i、 e.包含
条的
名称空间

没有

你可以用另一种方式:

void foo() {
    using bar::foo;
    foo(*this); /// OK now
}

不在方法本身之内。但是,您可以在.cpp文件中执行此操作:

namespace bar {
  namespace {
    auto outerFoo = foo;
  }
  void A::foo() {
      outerFoo(*this);
  }
}

请注意,名称
outerFoo
是一个隐藏的实现细节,它不会导致名称冲突(因为它位于匿名命名空间中)。

不在方法本身中。但是,您可以在.cpp文件中执行此操作:

namespace bar {
  namespace {
    auto outerFoo = foo;
  }
  void A::foo() {
      outerFoo(*this);
  }
}


请注意,名称
outerFoo
是一个隐藏的实现细节,它不会导致名称冲突(因为它位于匿名命名空间中)。

有一种方法:将
foo
s中的一个重命名为其他名称,这也将为您节省一些不眠之夜。您的示例与此问题没有任何关系。这个例子是一个多态性的例子,这是一个名称查找问题。@NathanOliver我更正了指向该问题已接受答案的指针。我的评论仍然是一样的。该解决方案使用多态性。虽然名称空间类似于文件系统中的目录,但没有等价于
。/
。最接近你的是
*这
/
有一种方法:将
foo
中的一个重命名为其他名称,这也将为你节省一些不眠之夜。你的示例与此问题毫无关系。这个例子是一个多态性的例子,这是一个名称查找问题。@NathanOliver我更正了指向该问题已接受答案的指针。我的评论仍然是一样的。该解决方案使用多态性。虽然名称空间类似于文件系统中的目录,但没有等价于
。/
。你得到的最接近的是
*这个
/
相比,你为什么叫它
?@Antonio,因为它把一个名字从一个外部范围带到了一个更窄的内部范围。你为什么叫它
?@Antonio,因为它把一个名字从一个外部范围带到了一个更窄的内部范围。太棒了!我只是很遗憾没有使用C++11
auto
,但以防我能绕过它。注意:当
bar
名称空间更改名称时,这将成为公认的答案。在这种情况下,您必须拼写类型或写入
inline void outerFoo(A&A){foo(A);}
。太好了!我只是很遗憾没有使用C++11
auto
,但以防我能绕过它。注意:当
bar
名称空间更改名称时,这将成为公认的答案。在这种情况下,您必须拼写类型或写入
inline void outerFoo(A&A){foo(A);}