1

我认为友元函数可以访问类变量,就像我尝试在 << 函数中执行 vx、vy、vz 一样。但它不编译。它说它无法在这些行解析标识符。

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

3 回答 3

1

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

您还需要将您operator<<的名称放入vec. 毕竟,您已经在该命名空间中请求了一个友元函数。

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

于 2013-02-12T00:46:30.910 回答
1

您的编译错误可能与以下问题有关:

  • 默认参数仅用于函数声明而不是函数定义,您正在做相反的事情。
  • 此外,在 Vector.cpp 中,您应该将类​​成员函数定义包装在命名空间中,而不是调用using directive.

尝试:

矢量.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&);

    };

向量.cpp

namespace vec
{
   Vector::Vector(double x1, double y1, double z1)
   :x(x1), y(y1), z(z1)
   {
   }
}
于 2013-02-12T00:34:16.107 回答
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&)
于 2013-02-12T00:36:12.937 回答