使用gcc版本5.2.0(GCC)并使用--std=c++14,如果取消注释MyNamespace命名空间中的operator ostream,以下代码将不再编译通过。这是一个错误还是特性?(使用g++ -c --std=c++14 x.cxx进行编译)
#include <string>
#include <iostream>
typedef std::pair<std::string, std::string> StringPair;
std::ostream& operator<<( std::ostream&, const StringPair &pair) {
std::cout <<pair.first<<"."<<pair.second;
}
namespace MyNamespace {
class MyClass {};
//std::ostream& operator<< (std::ostream&, const MyClass &);
void xxx ();
}
void MyNamespace::xxx () {
StringPair pair;pair.first="1";pair.second="2";
std::cout <<pair<<std::endl;
}
如果我不注释运算符<<,则会得到以下错误消息:
x.cxx: In function ‘void MyNamespace::xxx()’:
x.cxx:18:13: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘StringPair {aka std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >}’)
std::cout <<pair<<std::endl;
^
operator<<
函数返回一些内容。并且您可能应该使用作为参数传递的流,而不是硬编码std::cout
。这并不能解决您的问题,但是无关的问题往往会隐藏实际的问题。 - Some programmer dude