2013-02-12 66 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