2010-10-01 52 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