命名空间,类成员ADL冲突
namespace, class member ADL conflict
#include <iostream>
namespace outside {
struct A {
int outer = 42;
friend void print(A const& a, std::ostream& os)
{ os << "outside::A " << a.outer << 'n'; }
};
namespace inside {
struct A : outside::A {
int inner = 24;
void print(std::ostream& os) { } // Added for extra difficulty
friend void print(A const& a, std::ostream& os) {
// outside::A::print(a, os); // <- does not compile
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);
}
是否有一种方法可以限定print函数,以便同时打印基成员和派生成员?我可以将这两个友元函数移到它们最近的封闭命名空间中:
#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);
}
成功了,结果如下:
outside::A 42
outside::A 42
inside::A 24
同样可以用好友函数实现吗?也许用using
?
编辑:inside::A::print(std::ostream&)
击败静态cast建议如下,https://stackoverflow.com/a/22585103/710408。还有其他选择吗?
我找到了可能的解决方案:
friend void print(A const& a, std::ostream& os) {
print(static_cast<const outside::A&>(a), os);
os << " inside::A " << a.inner << 'n';
}
一些信息为什么这个不工作:https://stackoverflow.com/a/382077/1938348结论很简单,当你在类体中定义friend
函数时,它是不可见的,除非你使用ADL。要使它像你期望的那样工作,你需要改变声明的位置:
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';
}
相关文章:
- 写入位置0x0000000C时发生访问冲突
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 有没有可能有一个只有ADL才能找到的非好友功能
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- 错误:使用通用引用的声明冲突
- 如何解决GTest和LibTorch联动冲突
- 两个运营商的一些奇怪的冲突<<
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++17 十六进制浮点文字单精度后缀冲突?
- 调用 ADL 时,表达式和命名空间之间是否会发生冲突
- 命名空间,类成员ADL冲突