2012-10-19 69 views
1

我想出了一個名爲TinyVector的小類。現在我試圖在它上面使用std :: inner_product。但是我無法讓它工作,我不明白爲什麼這不起作用。 我使用Visual Studio 2012在我自己的課上使用std :: inner_product

#include <iostream> 
#include <vector> 
#include <numeric> 

using namespace std; 

template<class T, int N> 
class TinyVector { 
public: 
    TinyVector() { data = vector<T>(N, 0); } 
    explicit TinyVector(const T initVal) { data = vector<T>(N, initVal); } 
    ~TinyVector() { data.clear(); } 
    inline T& operator[](int i) { return data[i]; } 
    inline T operator[](int i) const { return data[i]; } 
    inline vector<T>::const_iterator begin() const { return data.begin(); } //Line 15 
    inline vector<T>::const_iterator end() const { return data.end(); } //Line 16 
private: 
    vector<T> data; 
}; 

template<class T, int N> 
inline double dot(const TinyVector<T,N>& A, const TinyVector<T,N>& B) 
{ 
    return inner_product(A.begin(), A.end(), B.begin(), 0.0); 
} 

int main() 
{ 
    TinyVector<double, 10> Ty; 
    for (int i = 0; i < 10; ++i) 
     Ty[i] = i; 

    cout << dot(Ty,Ty) << endl; 
} 

編譯器告訴我: 語法錯誤:缺少 ';'在第15行標識符'開始'之前。 缺少類型說明符 - 假定爲int。注意:C++不支持第15行的default-int。 語法錯誤:缺少';'在第16行的標識符「結束」之前。 缺少類型說明符 - 假定爲int。注意:C++不支持第16行的default-int。

但將vector<T>::const_iterator更改爲vector::const_iterator似乎不是要走的路。 也將其更改爲'自動'不起作用。這給了我「期望的結尾返回類型」。 如果我刪除第15,16和17行,並用A.data.begin()替換A.begin(),並且接下來的兩個參數符合條件,那麼一切都很好。 但是爲什麼我的原始代碼沒有工作,我如何才能使它工作?

回答

5

你需要寫

inline typename vector<T>::const_iterator begin() const { return data.begin(); } //Line 15 
     ^^^^^^^^ 

這是因爲vector<T>::const_iterator是一個從屬名稱(這取決於類型參數T)等編譯器需要被告知vector<T>::const_iterator是一種類型(而不是,例如,一個enum值或靜態數據成員)。

+0

哇,真的很簡單。 所以你試圖說我,每當我使用取決於模板值的類型,我不得不使用'typename'來告訴編譯器我的類型是一種類型?因爲否則編譯器必須假定這個模板化的「類型」的實例化可能是其他的東西? – PanicSheep

+0

@PanicSheep對於任何'typedef'成員,是的(例如,當你編寫'vector '時,你不需要它。一個好的經驗法則是,無論你看到哪個地方,你可能需要使用'typename'。請參閱[哪裏,爲什麼我必須把「模板」和「typename」關鍵字?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put- the-template-and-typename-keywords)以獲得更深入的解釋。 – ecatmur

相關問題