为什么在这种情况下覆盖流插入运算符时会出现 "no operator found" 错误?
Why do I get a "no operator found" error when overriding the stream insertion operator in this situation?
我有一个包含多个头文件和源文件的项目,我已将其缩短为我认为这里很重要的部分(尽管我可能是错的)。他们看起来像这样:
A.hpp:
#pragma once
struct date_t {
unsigned int day{ 0 };
unsigned int month{ 0 };
unsigned int year{ 0 };
};
A.cpp:
#include <iostream>
#include "A.hpp"
using namespace std;
ostream& operator<<(ostream& output, const date_t& date) {
output << date.month << "/" << date.day << "/" << date.year;
return output;
}
B.hpp:
#pragma once
#include "A.hpp"
class B {
public:
date_t date;
};
B.cpp:
#include <iostream>
#include "B.hpp"
using namespace std;
ostream& operator<<(ostream& output, B& b) {
output << b.date;
return output;
}
在这种特殊情况下,B.cpp 给出了错误 no operator "<<" matches these operands; operand types are: std::basic_ostream<char, std::char_traits<char>> << date_t
。我不太确定是否需要更改重载函数中的参数,或者这是访问问题,那么为什么会在此处抛出此错误?为了跟进,如果也使用了插入重载,class B 会不会有类似的问题?
您在 A.cpp 中定义了 operator<<
,但您还需要在头文件中声明它,以便其他 cpp 文件中的代码知道它。
只需添加
std::ostream& operator<<(std::ostream& output, const date_t& date);
到A.hpp(定义struct date_t
之后)。您还需要将 #include <iostream>
添加到 A.hpp。
对另一个插入运算符做同样的事情。
您在一个 cpp 文件中定义但希望在另一个 cpp 文件中使用的任何函数或运算符都应在头文件中声明。
我有一个包含多个头文件和源文件的项目,我已将其缩短为我认为这里很重要的部分(尽管我可能是错的)。他们看起来像这样:
A.hpp:
#pragma once
struct date_t {
unsigned int day{ 0 };
unsigned int month{ 0 };
unsigned int year{ 0 };
};
A.cpp:
#include <iostream>
#include "A.hpp"
using namespace std;
ostream& operator<<(ostream& output, const date_t& date) {
output << date.month << "/" << date.day << "/" << date.year;
return output;
}
B.hpp:
#pragma once
#include "A.hpp"
class B {
public:
date_t date;
};
B.cpp:
#include <iostream>
#include "B.hpp"
using namespace std;
ostream& operator<<(ostream& output, B& b) {
output << b.date;
return output;
}
在这种特殊情况下,B.cpp 给出了错误 no operator "<<" matches these operands; operand types are: std::basic_ostream<char, std::char_traits<char>> << date_t
。我不太确定是否需要更改重载函数中的参数,或者这是访问问题,那么为什么会在此处抛出此错误?为了跟进,如果也使用了插入重载,class B 会不会有类似的问题?
您在 A.cpp 中定义了 operator<<
,但您还需要在头文件中声明它,以便其他 cpp 文件中的代码知道它。
只需添加
std::ostream& operator<<(std::ostream& output, const date_t& date);
到A.hpp(定义struct date_t
之后)。您还需要将 #include <iostream>
添加到 A.hpp。
对另一个插入运算符做同样的事情。
您在一个 cpp 文件中定义但希望在另一个 cpp 文件中使用的任何函数或运算符都应在头文件中声明。