Visual Studio 编译和检测运算符重载而 g++ 没有
Visual Studio Compiling & Detecting Operater Overloading While g++ doesn't
我有房子class。我用 house house;
初始化一个新的房子元素,然后将数据传递给它,然后计算它:
cout << house;
Couting house 在 Visual Studio 中运行良好,但由于某种原因,我在尝试使用 g++ 进行编译时收到此错误:
main.cpp:19:57: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ and ‘house’)
cout << "\nnext house to be visited:" << endl << endl << house << endl;
尽管我的一个头文件中非常清楚地包含了这个:
friend std::ostream& operator<< (std::ostream& out, house);
如果您能提供任何反馈,我将不胜感激,因为我看不出 g++ 没有理由看不到我的运算符重载函数。
编辑:这是我的运算符重载函数:
std::ostream& operator<< (std::ostream& out, const house& house)
{
out << "Address: " << house.getAddress() << std::endl
<< "Square Feet: " << house.getSqrFt() << std::endl
<< "Bedrooms: " << +house.getBedrooms() << std::endl
<< "Bathrooms: " << house.getBathrooms() << std::endl
<< "Description: " << house.getDescription() << std::endl;
return out;
}
这是我的房子class:
#ifndef HOUSE
#define HOUSE
class house
{
public:
house();
house(const char[], const unsigned short& sqrFt, const unsigned char& bedrooms, const float& bathrooms, const char[]);
house(house & obj);
house(house *& obj);
~house();
char * getAddress() const;
unsigned short getSqrFt() const;
unsigned char getBedrooms() const;
float getBathrooms() const;
char * getDescription() const;
void setAddress(const char address[]);
void setSqrFt(const unsigned short& sqrFt);
void setBedrooms(const unsigned char& bedrooms);
void setBathrooms(const float& bathrooms);
void setDescription(const char description[]);
void setEqual(house &, house*);
private:
char * address;
unsigned short sqrFt;
unsigned char bedrooms;
float bathrooms;
char * description;
};
#endif
这是我的队列 class,其中包含我的运算符重载函数的声明:
#ifndef QUEUE
#define QUEUE
#include <ostream>
#include "house.h"
class queue
{
public:
queue();
queue(queue & obj);
~queue();
void enqueue(house *& item);
bool dequeue(house & item);
void print() const;
void readIn(const char []);
private:
struct node
{
node();
house* item;
node * next;
};
node * head;
node * tail;
void getLine(std::ifstream&, char key[]);
friend std::ostream& operator<< (std::ostream& out, const char[]);
//friend std::ostream& operator<< (std::ostream& out, house *&);
friend std::ostream& operator<< (std::ostream& out, const house&);
};
#endif
问题是您为 house
声明的 operator<<
错误 class:
class queue
{
friend std::ostream& operator<< (std::ostream& out, const house&);
};
当您在 class X
中声明友元运算符时,仅当我们查找 X
时,对该运算符的查找才会成功。有了这个声明,我们只会在查找 queue
时找到 operator<<(std::ostream&, const house&)
- 但这是不可能的,因为参数的 none 是 queue
所以我们会永远不要试图用一个来查找它。
您需要将声明移动到正确的位置 class:
class house {
friend std::ostream& operator<< (std::ostream& out, const house&);
};
我有房子class。我用 house house;
初始化一个新的房子元素,然后将数据传递给它,然后计算它:
cout << house;
Couting house 在 Visual Studio 中运行良好,但由于某种原因,我在尝试使用 g++ 进行编译时收到此错误:
main.cpp:19:57: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ and ‘house’)
cout << "\nnext house to be visited:" << endl << endl << house << endl;
尽管我的一个头文件中非常清楚地包含了这个:
friend std::ostream& operator<< (std::ostream& out, house);
如果您能提供任何反馈,我将不胜感激,因为我看不出 g++ 没有理由看不到我的运算符重载函数。
编辑:这是我的运算符重载函数:
std::ostream& operator<< (std::ostream& out, const house& house)
{
out << "Address: " << house.getAddress() << std::endl
<< "Square Feet: " << house.getSqrFt() << std::endl
<< "Bedrooms: " << +house.getBedrooms() << std::endl
<< "Bathrooms: " << house.getBathrooms() << std::endl
<< "Description: " << house.getDescription() << std::endl;
return out;
}
这是我的房子class:
#ifndef HOUSE
#define HOUSE
class house
{
public:
house();
house(const char[], const unsigned short& sqrFt, const unsigned char& bedrooms, const float& bathrooms, const char[]);
house(house & obj);
house(house *& obj);
~house();
char * getAddress() const;
unsigned short getSqrFt() const;
unsigned char getBedrooms() const;
float getBathrooms() const;
char * getDescription() const;
void setAddress(const char address[]);
void setSqrFt(const unsigned short& sqrFt);
void setBedrooms(const unsigned char& bedrooms);
void setBathrooms(const float& bathrooms);
void setDescription(const char description[]);
void setEqual(house &, house*);
private:
char * address;
unsigned short sqrFt;
unsigned char bedrooms;
float bathrooms;
char * description;
};
#endif
这是我的队列 class,其中包含我的运算符重载函数的声明:
#ifndef QUEUE
#define QUEUE
#include <ostream>
#include "house.h"
class queue
{
public:
queue();
queue(queue & obj);
~queue();
void enqueue(house *& item);
bool dequeue(house & item);
void print() const;
void readIn(const char []);
private:
struct node
{
node();
house* item;
node * next;
};
node * head;
node * tail;
void getLine(std::ifstream&, char key[]);
friend std::ostream& operator<< (std::ostream& out, const char[]);
//friend std::ostream& operator<< (std::ostream& out, house *&);
friend std::ostream& operator<< (std::ostream& out, const house&);
};
#endif
问题是您为 house
声明的 operator<<
错误 class:
class queue
{
friend std::ostream& operator<< (std::ostream& out, const house&);
};
当您在 class X
中声明友元运算符时,仅当我们查找 X
时,对该运算符的查找才会成功。有了这个声明,我们只会在查找 queue
时找到 operator<<(std::ostream&, const house&)
- 但这是不可能的,因为参数的 none 是 queue
所以我们会永远不要试图用一个来查找它。
您需要将声明移动到正确的位置 class:
class house {
friend std::ostream& operator<< (std::ostream& out, const house&);
};