我正在尝试实现一个允许我像这样进行调用的函数
// 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'
你们知道如何解决这个问题吗?
由于
答案 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);
}