我认为朋友函数可以访问类变量,就像我尝试在<<<<<<<<<<<<<<<<功能。但它没有编译。它说它无法在这些行解析标识符。
此外,我正在尝试学习如何使用命名空间。即使我在实现文件中使用命名空间vec,我仍然必须在所有内容之前包含Vector ::那么重点是什么?
标题文件:
#ifndef VECTOR_H
#define VECTOR_H
namespace vec {
class Vector {
private:
double x, y, z;
public:
Vector(double, double, double);
friend std::ostream& operator<<(std::ostream&, const Vector&);
};
}
#endif /* VECTOR_H */
.cpp文件:
#include "Vector.h"
#include <iostream>
using namespace vec;
//Constructor
Vector::Vector(double x1 = 0, double y1 = 0, double z1 = 0) {
x = x1;
y = y1;
z = z1;
}
//Have also tried adding vec:: and Vector:: before operator<< here.
std::ostream& operator<<(std::ostream& out, const Vector& v) {
out<<"<"<<v.x<<", "<<v.y<<", "<<v.z<<">";
return out;
}
答案 0 :(得分:1)
您的编译错误可能与以下问题有关:
using directive
。尝试:
Vector.h
#include <iostream>
class Vector {
private:
double x, y, z;
public:
Vector(double x1 = 0, double y1 = 0, double z1 = 0);
^^ ^^ ^^
friend std::ostream& operator<<(std::ostream&, const Vector&);
};
Vector.cpp
namespace vec
{
Vector::Vector(double x1, double y1, double z1)
:x(x1), y(y1), z(z1)
{
}
}
答案 1 :(得分:1)
我认为问题的一部分是你的vec.h没有#include <iostream>
,因此在该文件中未识别类型std::ostream
,因为该部分是在vec.cpp之前编译的主要部分,它无法识别您的功能。
您还需要将operator<<
放入vec
的命名空间。毕竟,您已在该命名空间中请求了友元函数。
通过这两项更改,您的代码将使用gcc -Wall -Wextra -O2
进行编译。
答案 2 :(得分:0)
friend std::ostream& operator<<
声明出现在命名空间vec
中,因此定义应以vec::
为前缀。您的评论说您尝试过 - 也许您对其他错误消息billz文档感到困惑,但您应该恢复vec::operator<<
或用namespace vec { ... }
包围它。
这会产生如下错误:
ns.cc: In function `int main()':
ns.cc:26: error: ambiguous overload for 'operator<<' in 'std::cout << w'
ns.cc:19: note: candidates are: std::ostream& operator<<(std::ostream&, const vec::Vec&)
ns.cc:10: note: std::ostream& vec::operator<<(std::ostream&, const vec::Vec&)