C++类外运算符实现解析为`namespace::operator<<`而不是`operator<<`。
C++类外运算符实现解析为`namespace::operator<<`而不是`operator<<`。
所以我正在为一个类写operator<<
重载,如下所示:
#test.hh #pragma once #include namespace ns { struct test { double d; test(double x): d(x) {} friend std::ostream& operator<<(std::ostream&, const test&); }; }
#test.cc #include"./test.hh" std::ostream& operator<<(std::ostream& os, const ns::test& a) { os << a.d; return os; }
使用以下主函数进行测试:
#main.cc #include"./test.hh" #include int main() { ns::test a(12); std::cout << a << std::endl; return 0; }
当使用g++ test.cc main.cc
编译时,会返回以下错误:
/usr/sbin/ld: /tmp/cc6Rs93V.o: in function `main': main.cc:(.text+0x41): undefined reference to `ns::operator<<(std::ostream&, ns::test const&)' collect2: error: ld returned 1 exit status
显然,编译器将函数解析为ns::operator<<
,而应该调用operator<<
。我知道C++会在参数的命名空间中查找函数,但我是否错误地实现了运算符重载?像这样的答案似乎像我一样实现了相同的内容,唯一的区别是它们都在头文件中编写。
我哪里做错了?如何解决此类问题?
admin 更改状态以发布 2023年5月21日
这是我针对像这种情况的解决方案:
#includenamespace ns { struct test { double d; test(double x) : d(x) {} friend std::ostream& operator<<(std::ostream&, const test&); }; std::ostream& operator<<(std::ostream& os, const ns::test& a) { os << a.d; return os; } } int main() { ns::test a(12); std::cout << a << std::endl; return 0; }