Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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+中命名空间和子命名空间中的运算符+;17是模棱两可的_C++_Namespaces_Operator Overloading_C++17_Overloading - Fatal编程技术网

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';