C++ 命名空间、类成员ADL冲突 #包括 外部命名空间{ 结构A{ int-outer=42; friend void打印(常量和A,标准::ostream和os) {os
我找到了可能的解决方案:C++ 命名空间、类成员ADL冲突 #包括 外部命名空间{ 结构A{ int-outer=42; friend void打印(常量和A,标准::ostream和os) {os,c++,argument-dependent-lookup,friend-function,C++,Argument Dependent Lookup,Friend Function,我找到了可能的解决方案: #include <iostream> namespace outside { struct A { int outer = 42; }; void print(A const& a, std::ostream& os) { os << "outside::A " << a.outer << '\n'; } namespace inside { struct A : outsi
#include <iostream>
namespace outside {
struct A { int outer = 42; };
void print(A const& a, std::ostream& os)
{ os << "outside::A " << a.outer << '\n'; }
namespace inside {
struct A : outside::A {
void print(std::ostream& os) { } // Added for extra difficulty
int inner = 24;
};
void print(A const& a, std::ostream& os) {
outside::print(a, os); // <- works
os << " inside::A " << a.inner << '\n';
}
} // inside
} // outside
int main(int argc, char *argv[]) {
outside::A a_outside;
outside::inside::A a_inside;
print(a_outside, std::cout);
print(a_inside, std::cout);
}
你是说:
namespace outside {
struct A {
int outer = 42;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
os << "outside::A " << a.outer << '\n';
}
namespace inside {
struct A : outside::A {
int inner = 24;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
outside::print(a, os);
os << " inside::A " << a.inner << '\n';
}
} // inside
} // outside
friend void print(一个const&A,std::ostream&os){
//外部::A::打印(A,os);
打印(静态投影(a),操作系统);
操作系统这很好,也感谢链接。我添加了一个名字相同的成员,这有点不公平,它打败了静态强制转换…有什么想法吗?然后你需要使用第二个例子。你不能在类定义中使用ADL和friend函数,因为他首先找到成员函数(定义在同一范围内).ADL旨在解决来自不同名称空间的冲突,而不是来自同一类的冲突。或者更改该成员类的名称。
friend void print(A const& a, std::ostream& os) {
print(static_cast<const outside::A&>(a), os);
os << " inside::A " << a.inner << '\n';
}
namespace outside {
struct A {
int outer = 42;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
os << "outside::A " << a.outer << '\n';
}
namespace inside {
struct A : outside::A {
int inner = 24;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
outside::print(a, os);
os << " inside::A " << a.inner << '\n';
}
} // inside
} // outside
friend void print(A const& a, std::ostream& os) {
// outside::A::print(a, os);
print(static_cast<const outside::A&>(a), os);
os << " inside::A " << a.inner << '\n';
}