c++ - 友元函数无法访问类变量,无法理解命名空间

标签 c++ namespaces friend

我认为友元函数可以访问类变量,就像我尝试在 << 函数中执行 v.x、v.y、v.z 一样。但它不编译。它表示无法在这些行解析标识符。

我也在努力学习如何使用命名空间。即使我在实现文件中使用了命名空间 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;
}

最佳答案

我认为部分问题是您的 vec.h 没有 #include <iostream> , 所以类型 std::ostream在该文件中未被识别,并且由于该部分是在 vec.cpp 主要部分之前编译的,因此它无法识别您的函数。

您还需要输入您的 operator<<进入 vec 的命名空间.毕竟,您已经在该 namespace 中请求了友元函数。

通过这两项更改,您的代码将使用 gcc -Wall -Wextra -O2 进行编译.

关于c++ - 友元函数无法访问类变量,无法理解命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823562/

相关文章:

c++ - 我可以用 boost.program_options 做什么和不能做什么?

c++ - 从服务启动时键盘布局错误

c# - 我的命名空间有什么问题?

c++ - 将一个派生类声明为 friend 以访问基类的私有(private)成员

c++ - 当模板参数无效时如何抛出异常?

c# - 找不到命名空间名称 'SyntaxTree'

kubernetes - 命名空间 “stuck” 作为终止

c++ - 尽管有友元,但无法访问基类

c++ - 模板化 << friend 在与其他模板化 union 类型相互关联时不工作

c++ - 将两个相似的 make 规则减少为一个通用规则