我正在尝试实现一个允许我像这样进行调用的函数
// 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&lt; 0&gt;(vec5),其中vec5是元组的一些向量,它说
main.cpp:在函数'int main()'中: main.cpp:156:错误:冲突声明'myfunction&lt; 0&gt; vec5' main.cpp:155:错误:'vec5'的前一个声明为'main():: vec1_t vec5'
你们知道如何解决这个问题吗?
由于
答案 0 :(得分: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
用于告诉编译器某个限定名称用于表示类型而不是值(函数/静态数据成员/等)。
通过添加template
解决的第二个问题类似。它告诉编译器get
是一个模板,因此<N
不是与N
的比较,而是模板参数列表的开头。
答案 1 :(得分:2)
您需要在T::iterator
前面使用typename。所以说typename T::iterator
。
编辑1包括{Johan}所指示的template
以防止错误信息。
所以,你的代码应该是这样的:
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;
}
};