2010-02-02 34 views
3

我在編譯以下頭部時遇到問題。這是我對模板的第一次體驗,我想我錯了。編譯器在vector<vector<T>> data_;處指出錯誤和運算符重載函數。我想data_載體與OptBaseMatrix對象具有相同的類型,但我不知道該怎麼做......我真的不知道如何解決這個問題。幫幫我!也是模板的模板類和類屬性

#ifndef OPTBASEMATRIX_H 
#define OPTBASEMATRIX_H 

#include <vector> 

template<typename T> 
class OptBaseMatrix 
{ 
public: 
vector<vector<T>> data_; 

OptBaseMatrix(int rows, int cols); 
~OptBaseMatrix(); 

void readMatrix(); 
void printMatrix(); 
int getRows(); 
int getCols(); 

    OptBaseMatrix<T> operator+(const OptBaseMatrix<T>& matrix1, const OptBaseMatrix<T>& matrix2); 

private: 
int rows_; 
int cols_; 
}; 

#endif // OPTBASEMATRIX_H 

UPDATE:這裏是來自調試器的日誌的一個片段:

Error 1 error C2143: syntax error : missing ';' before '<' optbasematrix.h 17 TD2 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int optbasematrix.h 17 TD2 

我試圖修改矢量> data_中的數據;通過vector> data_;並仍然得到相同的錯誤:/我讀了我的模板類頭(.h)和實現(.cpp)必須在同一個文件...這可能是相關的?

UPDATE 2:哇!我忘記了「使用名稱空間標準;」。現在問題似乎已經修復!

+0

它可以幫助你包括你所得到的實際誤差。 – 2010-02-02 17:37:33

回答

2

嘗試:

vector<vector<T> > data_; 
+1

也許值得注意的是,Bjarne Stroustrup稱之爲 - 即那個人不能說矢量> v,但必須說矢量> v - C++的「尷尬」之一。例如,見http://www2.research.att.com/~bs/DnE2005.pdf看來,隨着C++ 1y的發展,這個問題將不再與我們在一起。 – 2010-02-02 22:11:47

8

你需要把兩個>之間的空間。

vector<vector<T> > data_; 

沒有空間,>>被視爲一個數據流的提取/右移位運算符。

此外,您可能需要申報operator+作爲一個自由的功能,或者您必須只有一個參數,它聲明:

// Member function 
Matrix<T> operator+(const Matrix<T>& other) const; 

// Free function (`friend` makes the function free 
// even though it's declared within the scope of the class definition) 
friend Matrix<T> operator+(const Matrix<T>& lhs, const Matrix<T>& rhs); 
+1

這是需要幾小時或幾天才能第一次弄清楚的事情,但那你永遠不會忘記! – 2010-02-02 18:30:13

+0

「朋友」不僅僅是允許你在類花括號中聲明一個自由函數。如果函數是在類大括號外定義的,那麼它將允許它訪問類的私有成員。如果函數也是在類的大括號中定義的,那麼它將會有附加的效果,將其從添加的查找規則中隱藏起來,其中的參數不是模板類,它有自己的優點... BTW:它通常是推薦的實現運算符+ =(必須是成員),然後使用+ = – 2010-02-02 18:30:50

+0

的免費函數運算符+謝謝!但是,我仍然遇到錯誤(請參閱更新)。 – 2010-02-02 18:56:42