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++11auto
,但以防我能绕过它。注意:当bar
名称空间更改名称时,这将成为公认的答案。在这种情况下,您必须拼写类型或写入inline void outerFoo(A&A){foo(A);}
。太好了!我只是很遗憾没有使用C++11auto
,但以防我能绕过它。注意:当bar
名称空间更改名称时,这将成为公认的答案。在这种情况下,您必须拼写类型或写入inline void outerFoo(A&A){foo(A);}
。