模板矢量

Bob*_*Bob 0 c++ templates boost tuples vector

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

// veca is a vector of tuples in my case
columnViewOfTuple<0>(veca);
Run Code Online (Sandbox Code Playgroud)

我实现了如下功能

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

每当我调用myfunction <0>(vec5)时,其中vec5是元组的一些向量,它说

main.cpp:在函数'int main()'中:main.cpp:156:错误:冲突声明'myfunction <0> vec5'main.cpp:155:错误:'vec5'的前一个声明为'main() :: vec1_t vec5'

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

谢谢

Joh*_*itb 5

循环应该是

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

否则,编译器将T::iterator视为非类型(在分析时,它还不知道T::iterator将来会发生什么!)并且可能会将其解析为表达式的唯一组成部分.在it这则以下是编译器的废话所以它需要一个;之前.

typename 用于告诉编译器某个限定名称旨在表示类型而不是值(函数/静态数据成员/等).

通过添加解决的第二个问题template是类似的.它告诉编译器这get是一个模板,因此<N不是对比N,而是模板参数列表的开头.