2013-10-31 46 views
0

我想重新創建我自己的理解向量類。在嘗試編譯此代碼時,我最近在Visual Studio 2013中遇到了一個問題。我正在一個錯誤每個「向量」關鍵字,指出:C++ Visual Studio「噁心的宏Hack」編譯問題

enter image description here

我不知道如果這是我的類定義內的誤差範圍,如果這是別的東西。 我還沒有玩過任何設置。

#include "../../../std_lib_facilities.h" 

    class vector{ 
     int sz; 
     double* elem; //pointer to the first element (of type double) 

    public: 
     vector(int s) :sz(s), //constructor - allocates s doubles , :size(s) is a 'initilization list' 
      elem(new double[s]) 
     { 
      for (int i = 0; i < s; i++) 
       elem[i] = 0; //initialize elements 

     } 

     int size() const 
     { 
      return sz; 
     } 

     //read 
     double get(int n) 
     { 
      return elem[n]; 
     } 

     //write 
     void set(int n, double v) 
     { 
      elem[n] = v; 
     } 


     //Every class that owns a resource needs a destructor 
     ~vector() //destructor 
     { 
      delete[] elem; // free memory 
     } 

    }; 


    int main(int argc) 
    { 
     vector v(5); 
     for (int i = 0; i < v.size(); i++){ 
      v.set(i, i); 
      cout << "v[" << i << "]==" << v.get(i) << '\n'; 
     } 
     system("PAUSE"); 

    } 

如果您需要了解更多信息,請不要猶豫,問。

+0

添加#undef向量可以提供幫助嗎? – LeeNeverGup

+0

頭文件中有什麼? – Serdalis

+0

我建議你調用別的東西(比如'myvector'),或者不要在定義宏的地方包含頭部。如果您無法避開該標題並且不想重命名您的類,請按照建議嘗試'#undef'。微軟不應該將宏用於受命名空間保護的東西。這是真的很低。 – paddy

回答

1

我假設this是您包含的std_lib_facilities.h。該文件包含宏

// disgusting macro hack to get a range checked vector: 
#define vector Vector 

這會導致所有跟隨你的代碼vector發生,被Vector取代。因此,當您聲明class vector時,它會變爲class Vector,並且由於您包含的頭已聲明名爲Vector的模板類型,因此您可能會收到重新定義的符號錯誤。此外,主要是當您聲明vector v(5);時,它將被更改爲Vector v(5),並且由於在std_lib_facilities.h中聲明的原始Vector類需要模板參數,因此您會在問題中發佈有關缺少模板參數的錯誤消息。

爲了解決這個問題,你既可以你的類重命名爲vector其他的東西,你可以#undef vector你包括std_lib_facilities.h,或之後,你不能因爲標準庫的唯一部分使用的是包括標題的所有,只是#include <iostream>std::cout

1

在網上搜索,我發現你header file ......它包含了一行:

// disgusting macro hack to get a range checked vector: 
#define vector Vector 

我不知道爲什麼你正在使用它,但是這是你的問題的原因。

要使用矢量所有你需要做的是#include <vector>

要添加一些澄清,頭文件創建了一個名爲Vector然後#define可以確保的vector所有initialisations實際上是指這個Vector矢量類類。

重命名你的班級將爲你解決這個問題。

作爲一個方面說明,該頭文件是可怕的,使用它時要小心。

+2

重點是他們想創建自己的理解向量。 – ChiefTwoPencils

+0

@BobbyDigital他們可以做到這一點,如果他們想要的。但這是什麼導致他的問題。 – Serdalis

+0

所以我注意到這個頭文件使用'namespace std;',不會總是污染'vector'嗎? – ChiefTwoPencils