模板矢量

时间:2010-10-01 21:48:08

标签: c++ templates boost vector tuples

我正在尝试实现一个允许我像这样进行调用的函数

// 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'

你们知道如何解决这个问题吗?

由于

2 个答案:

答案 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;
    }
};