矢量模板冲突的声明

时间:2010-10-01 23:10:21

标签: c++ templates boost vector typename

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

    // vec5 is a vector of tuples in my case
    // some code that to declare and fill vec5
    columnViewOfTuple<0>(vec5);

我实现了以下功能

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 :(得分:2)

myfunction<0>(vec5);实际上是myfunction<0> vec5;。它声明了一个对象,并没有创建临时对象。您需要将语句的歧义消除为表达式语句

(myfunction<0>(vec5));

最终你想做的是

myfunction<0>()(vec5);

因为你写的内容是打算创建一个临时的并传递vec5作为构造函数参数。您实际需要的是通过默认构造函数创建对象,然后如上所述调用函数调用操作符。

答案 1 :(得分:1)

约翰内斯解释了什么是错的。

这就是你能做的。

1)我认为不需要它是一个结构,因此是一个免费的功能(尽可能地适合你)。

2)可以使用boost::tuples::element从元组中查询第n个元素的类型(并且可以使用value_type typedef从容器中查询元组的类型 - 不需要R参数。

#include <boost/tuple/tuple.hpp>
#include <vector>

template <int N, class TupleContainer>
std::vector<typename boost::tuples::element<N, typename TupleContainer::value_type>::type>
  copy_tuple_column(const TupleContainer& c)
{
    std::vector<typename boost::tuples::element<N, typename TupleContainer::value_type>::type> results;
    for (typename TupleContainer::const_iterator it = c.begin(); it != c.end(); ++it) {
        results.push_back(boost::tuples::get<N>(*it));
    }
    return results;
}

int main()
{
    std::vector<boost::tuple<int, double> > tuples;
    std::vector<int> ints = copy_tuple_column<0>(tuples);
    std::vector<double> doubles = copy_tuple_column<1>(tuples);
}