我想出了一個名爲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(),並且接下來的兩個參數符合條件,那麼一切都很好。 但是爲什麼我的原始代碼沒有工作,我如何才能使它工作?
哇,真的很簡單。 所以你試圖說我,每當我使用取決於模板值的類型,我不得不使用'typename'來告訴編譯器我的類型是一種類型?因爲否則編譯器必須假定這個模板化的「類型」的實例化可能是其他的東西? – PanicSheep
@PanicSheep對於任何'typedef'成員,是的(例如,當你編寫'vector'時,你不需要它。一個好的經驗法則是,無論你看到哪個地方,你可能需要使用'typename'。請參閱[哪裏,爲什麼我必須把「模板」和「typename」關鍵字?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put- the-template-and-typename-keywords)以獲得更深入的解釋。 –
ecatmur