2013-02-12 32 views
1

我認爲朋友函數可以訪問類變量,就像我在如何嘗試在函數中執行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; 
} 
+1

什麼*確切*錯誤(S)說? – 0x499602D2 2013-02-12 00:33:08

+0

它說「無法解析標識符x」。然後下一行「無法解析標識符y」。並且「無法解析標識符z」。 – user1884814 2013-02-12 00:35:12

回答

1

你的編譯錯誤可以相對於下面的問題:

  • 默認參數只到函數聲明不起作用 定義,你正在做另一種方式。
  • 另外,在Vector.cpp中,您應該將名稱空間中的類成員函數 定義包裝起來,而不是調用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) 
    { 
    } 
} 
+0

好的,但我仍然沒有得到我的問題的答案。爲什麼我的朋友不能訪問x,y和z!我甚至沒有得到編譯錯誤,因爲它看不到這些變量。 – user1884814 2013-02-12 00:41:16

+0

你的錯誤信息是什麼?它適用於我的編譯器。嘗試用我的答案修復你的代碼,看看你是否仍然有錯誤 – billz 2013-02-12 00:42:18

+0

我得到的唯一錯誤消息是:「無法解析標識符x。無法解析標識符y。無法解析標識符z。「 – user1884814 2013-02-12 00:45:39

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&) 
1

我認爲問題的一部分是,你vec.h沒有#include <iostream>,所以類型std::ostream是在該文件不明,而且由於這部分是編譯在vec.cpp主要部分之前,它無法識別你的函數。

您還需要將operator<<放入vec的命名空間中。畢竟,你已經要求在該命名空間內的一個朋友功能。

通過這兩項更改,您的代碼將編譯爲gcc -Wall -Wextra -O2