C++ 重载C+中命名空间和子命名空间中的运算符+;17是模棱两可的
我试图重载C++ 重载C+中命名空间和子命名空间中的运算符+;17是模棱两可的,c++,namespaces,operator-overloading,c++17,overloading,C++,Namespaces,Operator Overloading,C++17,Overloading,我试图重载操作符 我希望在操作之前必须“命名”操作符,就像使用test::operator时一样,如果您有: using test::debug::operator<<; std::cout << a << "\n"; 其中,debug只是一种类型,它有一个对a的成员引用,并且有自己的自定义日志记录,它比通常更详细。您能详细说明为什么您认为它不含糊吗?它们具有完全相同的签名。我认为我必须使用test::operator显式地使用,但额外的
操作符
我希望在操作之前必须“命名”操作符,就像使用test::operator时一样,如果您有:
using test::debug::operator<<;
std::cout << a << "\n";
其中,debug
只是一种类型,它有一个对a
的成员引用,并且有自己的自定义日志记录,它比通常更详细。您能详细说明为什么您认为它不含糊吗?它们具有完全相同的签名。我认为我必须使用test::operator显式地使用,但额外的调试数据不会给您带来太多<代码>\\\\\\\
和\\\\\\\\
将始终是运算符所在的文件。哦,我不知道。是的,没错。我以为预处理器使用调用它的文件和行。不,不幸的是没有。这就是日志库通常使用宏的原因,比如:#define LOG(msg)std::我非常感谢您的帮助@idclev 463035818的代码示例帮助了我一点,这就是为什么我将他的回答标记为解决方案,但您的回答也非常好。我只能选择一个。使用和定义有什么区别operator@MikaelH这里只进行常规的、无条件的查找。我们从最里面的范围到最外面的范围,直到找到一个候选者,然后停止。因此,一旦找到test::debug::operatorOh,它就与名称空间没有任何关系。如果我们使用
调用,符号将被拉入该范围,并且它将被明确地找到?(就像在作用域中重新定义全局变量inta=2;
{inta=3;std::cout一样
namespace test {
namespace debug {
struct debug_A {
const A& data;
debug_out(const A& a) : a(a) {}
};
std::ostream& operator<< (std::ostream& os, const debug_A& d) {
auto& a = d.data;
std::string info = "\n\tDebug\n"
"\t\tLine: " + std::to_string(__LINE__) + "\n"
"\t\tFile: " __FILE__ "\n"
"\t\tDate: " __DATE__ "\n"
"\t\tTime: " __TIME__ "\n"
"\t\tVersion: " + std::to_string(__cplusplus) + "\n";
return a.toStream(os) << info;
}
}
}
std::cout << test::debug::debug_A{ a } << '\n';
using test::debug::operator<<;
std::cout << a << "\n";
std::cout << debug{a} << '\n';