2013-02-12 67 views
0

我认为朋友函数可以访问类变量,就像我在如何尝试在函数中执行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; 
} 

//Operators 
std::ostream& operator<<(std::ostream& out, const Vector& v) { 
    out<<"<"<<v.x<<", "<<v.y<<", "<<v.z<<">"; 
    return out; 
} 
+2

你的函数定义为'矢量::运算<<';它应该是'operator <<'... – 2013-02-12 00:02:07

回答

4

朋友函数不是成员函数,以及operator<<需要不是为了具有ostream左侧的构件。将其更改为一项免费功能:

std::ostream& operator<<(std::ostream& out, Vector v) { 
       ^^ no qualification 

我也将采用const引用而不是值的向量。

+0

+1应该很快得到你的C++金徽章,我猜 – billz 2013-02-12 00:04:08

+0

@billz,很快,是的。我注意到不久前,我接近:) – chris 2013-02-12 00:04:47

+0

我改变了这个功能| std :: ostream&operator <<(std :: ostream&out,Vector&v){|但它没有区别,我仍然有同样的错误。 – user1884814 2013-02-12 00:06:33

1

你的朋友函数属于命名空间vec,必须定义为这样。

将其更改为:

std::ostream &vec::operator << (std::ostream &out , const Vector &v) { //etc 
+0

啊,我没有注意到命名空间。很简单,只需将cpp文件包装在'namespace vec {...}'中即可 – chris 2013-02-12 00:39:32