2010-10-01 77 views
0

我想實現一個功能,可以讓我做出這樣的模板矢量

// veca is a vector of tuples in my case 
columnViewOfTuple<0>(veca); 

呼叫我實現這樣的功能如下

template<int N> 
struct myfunction { 
    template<typename T, typename R> 
    std::vector<R> operator() (T& container) 
    { 
     std::vector<R> myvector; 
     for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
      myvector.push_back((R)(*it).template get<N>()); 
     return myvector; 
    } 
}; 

每當我叫myfunction的< 0>( vec5),其中vec5是一些元組的向量,它說

main.cpp:在函數'int main()'中: main.cpp:156:錯誤:衝突聲明'myfunction < 0> vec5' main.cpp:155:錯誤:'vec5'之前的聲明爲'main():: vec1_t vec5'

你們知道如何解決這個問題嗎?

感謝

+0

爲什麼要將int N作爲模板參數而不是函數參數? – JoshD 2010-10-01 21:50:44

+0

請參閱,例如:http://stackoverflow.com/questions/1600464/ – 2010-10-01 21:51:58

+0

這是一個要求。我需要N作爲模板參數 – Bob 2010-10-01 23:18:42

回答

5

循環應該是

for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
     myvector.push_back((R)(*it).template get<N>()); 

否則,編譯器會將T::iterator作爲非類型(在分析時,它還不知道什麼T::iterator將在以後!),並可能將其解析爲表達式的唯一組成部分。隨後的it對於編譯器來說是無稽之談,所以它在它之前預計爲;

typename用於告訴編譯器某個合格的名稱是用來表示一個類型而不是一個值(函數/靜態數據成員/ etc)。

第二個問題,通過添加template解決,類似。它告訴編譯器get是一個模板,因此<N不是N的比較,而是模板參數列表的開始。

+0

+1:發現缺少'typename'並且缺少'template'。 – 2010-10-01 21:52:57

+0

對於該模板片段+1(以及總體上的良好答案)。可悲的是,我自己並不知道這一點。 – JoshD 2010-10-01 22:00:32

2

您需要的T::iterator前使用類型名。所以說typename T::iterator

Edit1包括template,如Johannes所示,以防止錯誤信息。

所以,你的代碼應該是這樣的:

template<int N> 
struct myfunction { 
    template<typename T, typename R> 
    std::vector<R> operator() (T& container) 
    { 
     std::vector<R> myvector; 
     for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
      myvector.push_back((R)(*it).template get<N>()); 
     return myvector; 
    } 
}; 
+0

謝謝你,那很有幫助。但是,我試圖使用功能 – Bob 2010-10-01 22:28:44